Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web API路由操作_C#_Asp.net Web Api_Asp.net Web Api Routing - Fatal编程技术网

C# Web API路由操作

C# Web API路由操作,c#,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api Routing,目标是允许以下四个端点: POST v1/invoices<br/> POST v1/invoices/12345<br/> POST v1/invoices/12345/attachment<br/> POST v1/invoices/12345/image 以下是我在控制器中的四个函数定义: [HttpPost] [ActionName("PostAttachment")] public HttpResponseMessage P

目标是允许以下四个端点:

POST    v1/invoices<br/>
POST    v1/invoices/12345<br/>
POST    v1/invoices/12345/attachment<br/>
POST    v1/invoices/12345/image
以下是我在控制器中的四个函数定义:

[HttpPost]
[ActionName("PostAttachment")]
public HttpResponseMessage PostAttachment(int id)

[HttpPost]
[ActionName("PostImage")]
public HttpResponseMessage PostImage(int id)

[HttpPost]
public HttpResponseMessage Post(int id)    

[HttpPost]
public HttpResponseMessage Post()

然而,当我使用第一个URI发布发票时,得到识别的路由是附件路由。如何在ID变量后面定义具有不同部分的端点?

我认为必须定义另一个路由,因为第一个URI不应与InvoiceAttachments路由匹配,因为它的末尾没有“/attachments”

尝试使用一个路由

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}/{action}",
    defaults: new { id = RouteParameter.Optional, action = "DefaultAction"  }
);
然后装饰功能,如

[HttpPost]
[ActionName("DefaultAction")]
public HttpResponseMessage Post()


[HttpPost]
public HttpResponseMessage PostImage(int id)

您是否尝试过使用约束而不是默认值

routes.MapHttpRoute(
        name: "InvoiceAttachments",
        routeTemplate: "v1/invoices/{id}/attachments",
        defaults: new { controller = "invoices" },
        constraints: new { action = "PostAttachment" } 
    );

routes.MapHttpRoute(
        name: "InvoiceImages",
        routeTemplate: "v1/invoices/{id}/images",
        defaults: new { controller = "invoices" },
        constraints: new { action = "PostImage" } 
    );

routes.MapHttpRoute(
        name: "Default",
        routeTemplate: "v1/invoices/{id}",
        defaults: new { controller = "invoices" }
    );
更新:

您可以通过将该操作作为url的一部分来破解它:

routes.MapHttpRoute(
        name: "InvoiceAttachments",
        routeTemplate: "v1/invoices/{id}/{action}",
        defaults: new { controller = "invoices" },
        constraints: new {action = "attachments|images"}
    );

routes.MapHttpRoute(
            name: "default",
            routeTemplate: "v1/invoices/{id}",
            defaults: new { controller = "invoices", id = RouteParameter.Optional },
            constraints: new {action = "attachments|images"}
        );
以及控制器方法:

[HttpPost]
[ActionName("attachments")]
public HttpResponseMessage PostAttachment(int id)

[HttpPost]
[ActionName("images")]
public HttpResponseMessage PostImage(int id)

public HttpResponseMessage Post(int id)

public HttpResponseMessage Post()
明白了

路线:

routes.MapHttpRoute(
        name: "InvoiceStuff",
        routeTemplate: "v1/invoices/{id}/{*action}",
        defaults: new { controller = "invoices", action = "" }
    );
函数定义:

[HttpPost]
[ActionName("Attachments")]
public HttpResponseMessage Attachments([FromUri]int id)

[HttpPost]
[ActionName("Images")]
public HttpResponseMessage Images([FromUri]int id)

[HttpPost]
public HttpResponseMessage Post()

[HttpPost]
[ActionName("")]
public HttpResponseMessage Post([FromUri]int id)
工作完美。请注意,在路由中,我指定了默认操作“”,因为webAPI路由中存在通配符缺陷。如果我没有执行默认设置,就会抛出null引用异常。有关该缺陷的更多信息可在此处找到:-计划在ASP.NET v5中修复


谢谢你的帮助

当我执行/invoices/12345时,这不起作用,它将转到默认操作,并且没有传入id参数:/@NiX-您是否尝试将上述DefaultAction更改为接受int id参数
Post(int-id)
-否则您将永远无法获得传入的id…是的,我刚刚意识到我忘记了一个所需的端点:Post/v1/invoices,因此我需要一个Post(),Post(int-id)尝试了该操作并获得此异常:“找到了多个与请求匹配的操作:\r\nSystem.Net.Http.HttpResponseMessage posattachment(Int32)在类型控制器.Api.InvoicesController上\r\nSystem.Net.Http.HttpResponseMessage Post(Int32)在类型控制器.Api.InvoicesController上“,
[HttpPost]
[ActionName("Attachments")]
public HttpResponseMessage Attachments([FromUri]int id)

[HttpPost]
[ActionName("Images")]
public HttpResponseMessage Images([FromUri]int id)

[HttpPost]
public HttpResponseMessage Post()

[HttpPost]
[ActionName("")]
public HttpResponseMessage Post([FromUri]int id)