gpt4 book ai didi

c# - 在接口(interface)上定义的 WebApi 属性路由

转载 作者:太空狗 更新时间:2023-10-29 21:39:23 26 4
gpt4 key购买 nike

我正在尝试将 WCF/REST 服务项目转换为 MVC/WebAPI。服务层作为不同终端系统的包装器多次实现,所有实现都遵循接口(interface) (IContract) 中定义的通用契约。使用 WCF,我们在每个公开为 Web 服务方法的方法上定义了 [WebInvoke][OperationContract] 属性。在 WebAPI 中,这可以通过在 Controller 上定义的属性路由来简化。但是,我想保留在接口(interface)上定义的路由属性,因此所有实现的行为都相似。

这是旧界面的示例:

[ServiceContract]
public interface IContract
{
[WebInvoke(UriTemplate = "Version", Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
string GetVersion();
}

这是我希望得到的工作:

public interface IContract
{
[Route("Version")]
[HttpGet]
string GetVersion();
}

我也会考虑创建一个抽象基类,但是另一个 StackOverflow question让我觉得没有合适的替代品来替代 [WebInvoke(UriTemplate)] 使用 WebAPI 属性路由。是这样吗,或者有人可以向我指出类似的、受支持的技术吗?

谢谢

最佳答案

在对 ASP.NET 团队的成果进行更多研究后,看来 System.Web.Http.Routing.IDirectRouteProvider 可扩展性有望满足我们的需求。在撰写本文时,这仅适用于使用 ASP.NET 每晚构建,但希望在我们准备推出时达到 RTM 或至少 CTP。

下面的代码展示了如何为我上面的例子实现这个(原始来源:https://aspnetwebstack.codeplex.com/workitem/1464)

Application_StartWebApiConfig.Register() 中,将新的 IDirectRouteProvider 传递给 MapHttpAttributeRoutes() 方法。

config.MapHttpAttributeRoutes(new CustomDirectRouteProvider());

定义路由提供者如下。这基本上只是打开属性继承,因此它将从基类(而不是接口(interface))读取路由。

public class CustomDirectRouteProvider : DefaultDirectRouteProvider
{
protected override IReadOnlyCollection<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
{
return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: true);
}
}

在我的例子中,我们创建了一个抽象的 BaseApiController,它为 WebAPI 方法提供 [Route] 属性。

public abstract class BaseApiController : ApiController, IContract
{
[Route("Version")]
[HttpGet]
public abstract string GetVersion();

}

我们的终端系统以前是实现了 IContract 接口(interface)的 WCF REST 服务端点。对于 WebAPI, Controller 现在派生自 BaseApiController。 (我们还必须将名称从 ContractService 更改为 ContractServiceController。)为了向后兼容,我们保留了 IContract,但它现在是在 BaseApiController 上实现的。 [RoutePrefix] 属性在 Controller 上定义,在本例中是我们的根 URL。

[RoutePrefix("")]
public class TestController : BaseApiController
{
public override string GetVersion();
{
return "Version 1.0.0.0";
}
}

关于c# - 在接口(interface)上定义的 WebApi 属性路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22613377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com