在以下链接的5分钟视频中,在1:10标记处,Jon Galloway说,在他的CommentsController控制器类中添加一个名为DeleteComment的方法将按照约定自动映射到删除http动词.
如何使用WebApi的MVC知道如何将方法路由到正确的动词?我知道global.asax.cs文件中的路由将请求路由到正确的控制器,但是删除请求如何"按惯例"映射到delete方法或任何方法?特别是当每个动词可以有多于1种方法时?"按照惯例"让我觉得它只是在查看方法名称中的第一个单词...但如果是这样的话,它必须读取方法的签名来告诉两个删除方法或两个方法分开...以及是这个定义了吗?
视频:http: //www.asp.net/web-api/videos/getting-started/delete-and-update
谢谢!
编辑:以下是WebApi模板中的示例ValuesController类中的代码.这是我原来问题的来源.区分这些(以及控制器中的任何其他方法)的"约定"如何工作?
// GET /api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET /api/values/5
public string Get(int id)
{
return value;
}
Run Code Online (Sandbox Code Playgroud) 在把这些问题放在这里之前我搜索了很多但是我搜索的越多,我得到的就越混乱.
所以我创建了一个处理程序,我试图得到这样的路线:
public class ExecutionDelegatingHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (securityAuthority.VerifyPermissionToExecute(request.GetRouteData().Route.RouteTemplate, request.Headers))
{
return base.SendAsync(request, cancellationToken);
}
else
{
httpResponseMessage.StatusCode = HttpStatusCode.Unauthorized;
}
}
}
Run Code Online (Sandbox Code Playgroud)
GetRouteData返回null,因此我无法访问RouteTemplate属性,但我可以在堆栈深处的列表中看到该路径.我找到了许多可以用来获取路径的不同方法,但这些方法也评估为null.我对如何完成如此简单的事情感到有点迷茫.我使用自主机进行开发,但将使用IIS进行部署.
更新1
我忘了把我尝试过的其他东西放在这里:
//NULL
request.GetRouteData();
//EMPTY
request.GetRequestContext().Configuration.Routes.GetRouteData(request).Route.RouteTemplate;
//EMPTY
request.GetConfiguration().Routes.GetRouteData(request).Route.RouteTemplate;
Run Code Online (Sandbox Code Playgroud)
路线工作得很好,但奇怪的是,如果我试图让控制器为这个请求提供服务,我会得到一个404 ......如果我只是跳过那个我就会到达控制器就好了.
HttpControllerDescriptor httpControllerDescriptor = request.GetRequestContext().Configuration.Services.GetHttpControllerSelector().SelectController(request);
IHttpController httpController = httpControllerDescriptor.CreateController(request);
Run Code Online (Sandbox Code Playgroud)
我正在使用autofac来发现我定义的所有路径,如:
[Route("queries/organization/clients")]
[HttpGet]
public ClientInitialScreenModel GetClients()
{
return OrganizationModelsBuilder.GetClientInitialScreen();
}
Run Code Online (Sandbox Code Playgroud)
更新2
如果我在上面的行之后调用GetRouteData,我就可以获得路径模板:
base.SendAsync(request, cancellationToken);
var routeData = request.GetRouteData();
Run Code Online (Sandbox Code Playgroud)
所以也许我误解了整个图片,我无法在处理程序之前得到路由模板,该处理程序解析了为请求执行哪个控制器的工作......就是这样的情况?
作为参考,这是我正在处理的处理程序:
public class ExecutionDelegatingHandler : DelegatingHandler
{
protected override …Run Code Online (Sandbox Code Playgroud) c#-4.0 asp.net-web-api asp.net-web-api-routing asp.net-web-api2