Implementing–part 3
WebAPI2CLI
This is a part of the series where about how I made the WebAPI2CLI - Execute ASP.NET Core WebAPI from Command LineSource code on https://github.com/ignatandrei/webAPI2CLI/
First implementation was just a bunch a code thrown in an API project. All self contained, all in one WebAPI project.
Some problems that I have faced:
1. The class that executes( the hosted service ) should have access to the address of the server . However, the class is injected at the moment of creating services – and at this time the IServerAddressesFeature do not exists yet.
Solution: Inject at useCLi the IApplicationBuilder to get the services and verify if the adresses are ok:
// in private async void DoWork(object state)
serverAddresses = app.ServerFeatures.Get<IServerAddressesFeature>();
if (serverAddresses == null)
2. But how to get the instance of the Hosted service ? Simple,with Singletons:
// in public static IServiceCollection AddCLI(this IServiceCollection serviceCollection)
serviceCollection.AddSingleton<CLIAPIHostedService>();
serviceCollection.AddHostedService<CLIAPIHostedService>(p => p.GetService<CLIAPIHostedService>());
and later on
//in public static IApplicationBuilder UseCLI(this IApplicationBuilder app)
var service = app.ApplicationServices.GetService<CLIAPIHostedService>();
service.app = app;
3. How to serialize the headers, url, parameters, body and others in a file – as to pass easy json ?
The idea is that I wrote Json( for sending body data) in a json file it will become faster complicated. So I was thinking : What other serialized formats I know ?
So I was attracted by YAMLhttps://en.wikipedia.org/wiki/YAML . And there is an implementation https://github.com/aaubry/YamlDotNet . You can find a sample file at https://github.com/ignatandrei/WebAPI2CLI/blob/master/src/TestWebAPISite/cli.txt
4. What to do with errors ?
For example, if some HTTP returns an error message , what can I do ? The obvious idea is to return on the console the error too…
So I implemented this class to emulate answer
public class ReturnValue_v1
{
public ReturnValue_v1(HttpStatusCode statusCode):this(statusCode,null)
{}
public ReturnValue_v1(HttpStatusCode statusCode,string result)
{
StatusCode = statusCode;
Result = result;
}
public ICLICommand Command { get; private set; }public HttpStatusCode StatusCode { get; private set; }
public string Result { get; private set; }public ReturnValue_v1 FromCommand(ICLICommand cmd)
{
this.Command = cmd;
return this;
}}
to can return to the console the JSON of this object.
5. How to exit the application ?
This is simple – Environment.Exit(0);
However , maybe could be a feature to exit if we encounter an error in calling the API ? And if you want to help, https://github.com/ignatandrei/WebAPI2CLI/issues/10
6. How to figure the WebAPI endpoints ?
Simple – with IApiDescriptionGroupCollectionProvider
7. How to help the user to not change the port of adresses every time the .NET Core server change the adress ?
There are so many ways to configure the address of ASP .NET Core – see https://josephwoodward.co.uk/2017/02/many-different-ways-specifying-host-port-asp-net-core . The CLI.txt file should work the same , no matter the port . So I decided to put just the beginning of the http and then find the right address ( and handle also the case with full URL)
In this file put just –
Host: http://
or
Host: https://
( Assumption : just one http and/or just 1 https when asp.net core will start )
WebAPI2CLI will find the adress and the port comparing
Alternatively, you can put the full URI ( without RelativeRequestUrl ! )
Host: http://localhost:5000/
8. How to make easier for the developer to integrate ?
Create extension – AddCLI and UseCLI .
Leave a Reply