返回类型为HttpResponseMessage时,Web Api Get()路由不起作用
本文关键字:Get 路由 不起作用 Api Web HttpResponseMessage 返回类型 | 更新日期: 2023-09-27 17:58:54
这让我有点头疼。最终,我试图返回一个图像,但我一直在尝试并将其简化为使用字符串。
我想要什么:转到URL:
http://xxx/api/helloworld/1
回应:"你好,世界!"
以下web api声明适用于所提供的url;
public string Get([FromUri]int id) { return "Hello World"; }
public Task<string> Get([FromUri]int id) { return "Hello World"; }
什么不起作用;
public HttpResponseMessage Get([FromUri]int id)
{
return Request.CreateResponse<string>(HttpStatusCode.OK, "Hello World");
}
public HttpResponseMessage Get([FromUri]int id)
{
HttpResponseMessage response = new HttpResponseMessage();
string text = "Hello World";
MemoryStream test = new MemoryStream();
test.Write(ConversionUtilities.ToBytes(text) /*custom string->byte[] method, UTF-8 encoding*/, 0, text.Length);
response.Content = new StreamContent(test);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
response.StatusCode = HttpStatusCode.OK;
return response;
}
当我有一个返回类型为HttpResponseMessage的Get()时,会返回以下错误;
No HTTP resource was found that matches the request URI "http://xxx/api/helloworld/1"
此错误仅针对此特定返回类型出现。现在,我在WebApiConfig.cs文件中的路由如下(适用于"字符串"返回类型);
// Controller with ID
// To handle routes like "/api/VTRouting/1"
config.Routes.MapHttpRoute(
name: "ControllerAndId",
routeTemplate: "api/{controller}/{id}",
defaults: null,
constraints: new { id = @"^'d+$" } // Only integers
);
// Controllers with Actions
// To handle routes like "/api/VTRouting/route"
config.Routes.MapHttpRoute(
name: "ControllerAndAction",
routeTemplate: "api/{controller}/{action}"
);
// Controller Only
// To handle routes like "/api/VTRouting"
config.Routes.MapHttpRoute(
name: "ControllerOnly",
routeTemplate: "api/{controller}"
);
有什么想法吗?我对返回类型的行为感到困惑:-S
找到原因!我已经根据模板创建了一个空白的api控制器。提示进行一些复制/粘贴以缩小原因范围。这很微妙,我发布的代码之所以有效,是因为我更改了公开发布的变量名——这最终是问题的原因。想想看。
要复制,请按照正常方式创建模板。这将创建一个方法;
public string Get(int id)
将此更改为;
public string Get(int personID)
试着跑。您将得到如上所述的错误。看来Get/Post/etc参数的声明必须与路由中指定的声明相匹配。如果你像我一样将参数更改为"personID",你可以通过将参数重命名回默认的"id"或使用更新名称修改路由来修复;
config.Routes.MapHttpRoute(
name: "ControllerAndId",
routeTemplate: "api/{controller}/{personID}",
defaults: null,
constraints: new { personID = @"^'d+$" } // Only integers
);
请注意routeTemplate和约束参数中的"{personID}"。此字段的名称必须与参数的名称相匹配。当查找如何下载文件或只是查看web api时,它从未在文档中实际说过这一点。当深入了解路由/mvc的高级别细节时,可能会这样做,但我不得不说,这很容易让一个不熟悉这两种情况的n00b绊倒。请注意,我那些更有经验的同事也没有发现这一点:-)。我希望这能帮助其他有同样痛苦的人!