[英]Can I run WCF on top of WebAPI?
对于一个工作项目,我正在构建一个包含前端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控制器生成数据?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.