【问题标题】:Can I run WCF on top of WebAPI?我可以在 WebAPI 之上运行 WCF 吗?
【发布时间】:2015-12-09 15:54:56
【问题描述】:

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

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

为了实现这个目标,我创建了一个内部 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。)

虽然很有趣,但我不想重新发明轮子。有没有办法将 WCF 固定在 WebAPI 之上,仅用于服务器到服务器的调用,或者让 WCF 为 WebAPI 控制器生成数据?

【问题讨论】:

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


    【解决方案1】:

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

    使用 svutil 生成代理类可以很容易地适应 WCF“API”的变化。而且,您将拥有一个基于方法的接口来与 WCF 服务交互。

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

    【讨论】:

    • 有没有办法做到这一点 - 让 wcf 调用 webapi 逻辑?我们已经连接了 webapi,这是前进的方向。我不想将逻辑绑定到 wcf 中。我希望它是一个我们可以轻松删除的层。
    • 那么您想要一个 REST API 和一个 WCF (SOAP) 公开相同的逻辑吗?
    • 相同的模型,相同的逻辑。我们正在使用服务,但我觉得在一个地方而不是两个地方更新东西会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2020-08-11
    • 2010-10-11
    • 2012-04-01
    • 2013-11-28
    • 1970-01-01
    相关资源
    最近更新 更多