我可以在WebAPI上运行WCF吗?

时间:2015-12-08 22:50:49

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

对于工作项目,我构建的应用程序包括前端SPA(Aurelia),该SPA的WebAPI后端以及现有应用程序中包含的众多Web服务WebAPI项目。 (此应用程序将执行数据聚合 - 它是我们的客户显示来自许多来源的相关信息的仪表板。)

我立即遇到了一些挑战。使用WebAPI,我们希望将Web服务公开为REST端点。这适用于客户端应用程序,非常开放。但是,在.NET中进行服务器到服务器调用,我想抽象出REST调用并简单地提供一个基于方法的接口(所以我可以调用,比如new MyWebServiceClient().getOrders()或类似的东西);我也不想跨解决方案复制数据模型类,或者担心将一个JSON模型类型反序列化为另一种类型。 (Blegh。)

为了实现这一目标,我创建了一个内部nuget包,a)通过程序集提供对服务中使用的数据模型类的访问,以及b)提供HTTP调用的接口,抽象出JSON序列化和反序列化,如下所示:

public async Task<T> Get<T>(string endpoint, IEnumerable<KeyValuePair<string, string>> parameters = null, CancellationToken cancellationToken = default(CancellationToken))
{
    var builder = new UriBuilder(Properties.Settings.Default.MyEndpointHost + endpoint);
    builder.Query = buildQueryStringFromParameters(parameters);

    _httpClient.DefaultRequestHeaders.Accept.Clear();
    _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    try
    {
        // After this, we really shouldn't continue.
        var request = await _httpClient.GetAsync(builder.Uri, cancellationToken);

        if (!request.IsSuccessStatusCode)
        {
            if (request.StatusCode >= HttpStatusCode.BadRequest && request.StatusCode < HttpStatusCode.InternalServerError)
            {
                throw new EndpointClientException("Service responded with an error message.", request.StatusCode, request.ReasonPhrase);
            }

            if (request.StatusCode >= HttpStatusCode.InternalServerError && (int)request.StatusCode < 600)
            {
                throw new EndpointServerException("An error occurred in the Service endpoint.", request.StatusCode, request.ReasonPhrase);
            }
        }

        var json = await request.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<T>(json);
    }
    catch (Exception ex)
    {
        throw;
    }
}

公共方法只是方便的方法,用必要的参数调用该函数,如下所示:

    public async Task<IEnumerable<MyModel>> SearchMyModelsByFooName(string fooName, CancellationToken cancellationToken)
    {
        var parameters = new List<KeyValuePair<string, string>>();
        parameters.Add(new KeyValuePair<string, string>("searchText", fooName));

        return await this.Get<List<MyModel>>("myModel", parameters, cancellationToken);
    }

我已经有了很好的结果,虽然我必须手动维护它并更新依赖项。

然而,在与同事交谈之后,我被介绍给了WCF,看起来好像它解决了我试图手动解决的很多问题。然而,考虑到这一点,显示设置可能很棘手,我们不确定它是否值得这么麻烦。 (此外,我们必须维护两个API。)

虽然它很有趣,但我并不想重新发明轮子。有没有办法在WebAPI上使用WCF来进行服务器到服务器调用,或者让WCF为WebAPI控制器生成数据?

1 个答案:

答案 0 :(得分:0)

如果您不需要使用REST,并且我个人认为在.NET服务器到服务器方案中没有任何理由这样做,您可以创建一个WCF服务来公开您的数据。然后在WebAPI中生成调用WCF服务的代理类。

使用svutil生成代理类可以轻松适应WCF“API”中的更改。正如您所说,您将拥有一个基于方法的接口来与WCF服务进行交互。

使用svutil的参考: https://msdn.microsoft.com/en-us/library/ms733133(v=vs.110).aspx