如何通过创建像ASMX Web服务的实例来使用WebAPI

时间:2017-12-29 19:20:23

标签: c# asp.net asp.net-web-api

我将Asp.NET WebApi作为业务层。我想通过简单地调用业务控制器来调用它的方法。 这样的事情:(但我不能像服务参考那样添加这个webapi)

Business.API.UserController Users = new Business.API.UserController();
Users.GetAllUser();

之前我正在使用WCF Web服务,我只需通过添加服务引用"添加服务引用即可创建Web服务实例。并设置一些端点。 我不能在WebAPI中做到这一点(我认为)。我已经阅读了很多关于它的文章,但大多数都是关于通过HttpRequest调用它的方法。 这样:

using (var client = new HttpClient())    
{    
    client.BaseAddress = new Uri("http://localhost:38104/");
    client.DefaultRequestHeaders.Accept.Clear();    
    HttpResponseMessage response;    
    response = await client.GetAsync("api/Weather");    
    if (response.IsSuccessStatusCode)    
    {    
        WeatherClient[] reports = await response.Content.ReadAsAsync<WeatherClient[]>();                   
     }    
}    

我认为使用网络服务是荒谬的。 我错了还是我有问题?

2 个答案:

答案 0 :(得分:6)

虽然你没有任何问题,但这也不是一种使用网络服务的荒谬方式。事实上;它是唯一使用Web服务的方式; WCF为你隐藏了这段代码。

<子> 免责声明:还有其他.NET类和库执行HTTP请求,可能有一个更简单的API,但没有任何东西可以将它隐藏为像WCF这样的类

WCF服务发布关于他们自己的元数据,这就是为什么&#34;服务参考&#34;作品。 Web API没有类似的概念,您必须手动执行HTTP请求。您当然可以将该代码包装到一些通用函数中以供重用。

使用正确的帮助方法,您可以接近&#34; RPC&#34;接口,只需要传入每个方法的端点而不是名称。

答案 1 :(得分:2)

最好让类依赖于接口而不是直接实例化HttpClient。我已经看到过使用WCF服务正确执行此操作的应用程序 - 取决于服务接口 - 但是对于Web API,它们会丢弃抽象并直接包含Http请求。

在你的应用程序中,你仍然可以定义一个代表某种服务的接口,这样就可以抽象出实现 - Web API,mock和其他东西。

例如,您可能依赖此界面

public interface IFooService
{
    FooDto GetFoo(Guid id);
    List<FooDto> GetAllFoos();
    Guid InsertFoo(FooInsertDto foo);
    void UpdateFoo(FooDto updating);
    void DeleteFoo(Guid id);
}

并使用此实现:

public class FooServiceClient : IFooService
{
    private readonly RestClient _restClient;

    public FooServiceClient(string baseUrl)
    {
        _restClient = new RestClient(baseUrl.TrimEnd('/'));
    }

    public FooDto GetFoo(Guid id)
    {
        var request = new RestRequest($"api/foo/get{id}", Method.GET);
        var foo = _restClient.Execute<FooDto>(request).Data;
        return foo;
    }

    public List<FooDto> GetAllFoos()
    {
        var request = new RestRequest("api/foo/getall", Method.GET);
        var foos = _restClient.Execute<List<FooDto>>(request).Data;
        return foos;
    }

    public Guid InsertFoo(FooInsertDto foo)
    {
        var request = new RestRequest("api/foo/insert", Method.POST)
            { RequestFormat = DataFormat.Json};
        request.AddBody(foo);
        return _restClient.Execute<Guid>(request).Data;
    }

    public void UpdateFoo(FooDto updating)
    {
        var request = new RestRequest("api/foo/update", Method.POST)
        { RequestFormat = DataFormat.Json };
        request.AddBody(updating);
        _restClient.Execute(request);
    }

    public void DeleteFoo(Guid id)
    {
        var request = new RestRequest("api/foo/delete", Method.POST)
        { RequestFormat = DataFormat.Json };
        request.AddBody(id);
        _restClient.Execute(request);
    }
}

这也证明了RestSharp的使用。建议不要为每次使用创建和处置HttpClient。 RestSharp帮助管理它并提供简化发送请求和阅读响应的方法。