我有以下操作代码来接受服务请求:
namespace MyStuff.api
{
[RoutePrefix("api/Dy")]
[EnableCors(origins: "*", headers: "*", methods: "*")]
[Authorize]
public class DyController : ApiController
{
//...
[Route("{pit}/{name}")]
public void Post(string pit, string name, [FromBody]JObject obj)
{
//...
#region do something
// work with name here
#endregion
}
//...
}
}
测试场景
我在调试器中,并在 Post 方法中的某处设置断点。在数据集中,我找到了一个品牌名称" 3.1 Phillip Lim"。我试着找出如何操纵这个名称(以及其他类似的创意名称),以便 Post 方法被击中。
断点未命中 - 请求未到达Post
方法
- $.post("http://undisclosed.server.net/api/Dy/Brands/3.1%20Phillip%20Lim", MyStuff.Brands[30], function (result) { MyStuff.BrandsResult = result; })
- $.post("http://undisclosed.server.net/api/Dy/Brands/-3.1%20Phillip%20Lim", MyStuff.Brands[30], function (result) { MyStuff.BrandsResult = result; })
- $.post("http://undisclosed.server.net/api/Dy/Brands/id-3.1%20Phillip%20Lim", MyStuff.Brands[30], function (result) { MyStuff.BrandsResult = result; })
- $.post("http://undisclosed.server.net/api/Dy/Brands/body.Name", MyStuff.Brands[30], function (result) { MyStuff.BrandsResult = result; })
- $.post("http://undisclosed.server.net/api/Dy/Brands/{body.Name}", MyStuff.Brands[30], function (result) { MyStuff.BrandsResult = result; })
断点命中 - 请求按预期到达
$.post("http://undisclosed.server.net/api/Dy/Brands/body-Name", MyStuff.Brands[30], function (result) { MyStuff.BrandsResult = result; })
$.post("http://undisclosed.server.net/api/Dy/Brands/{null}", MyStuff.Brands[30], function (result) { MyStuff.BrandsResult = result; })
WebApi 2显然在幕后做了一些事情 - 可能是URL中段的某种类型识别......
请解释发生了什么......或者你是如何解决这个问题的。感谢。
答案 0 :(得分:0)
在我看来,您的问题与路线参数中的点字符直接相关。这是一个已知问题,取决于IIS / Web API将您的查询解释为静态文件请求(因为它以点+结尾似乎是扩展名)。
你可以尝试:
在请求URI中添加一个斜杠:
http://undisclosed.server.net/api/Dy/Brands/3.1%20Phillip%20Lim/
。
这应该足以允许Web API处理请求,但我必须承认这更像是一种解决方法。您可以在IIS中创建重写,使其成为this question的默认行为。
将 RAMMFAR 添加到您的Web.config
文件中:
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>
这可能就足够了,但如果它不能单独使用,那么将它与下面的方法结合使用。另请注意performance implications when using RAMMFAR。
为ExtensionlessUrlHandler
的任何路径(*
)添加Web.config
:
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
简单地放弃并且永远不要在尾随路线参数中使用点。通常我尝试将可能包含URI不友好字符的参数(如点,空格和任何必须编码的字符)移动到查询字符串中。另一个选择是简单地用更多URI友好的字符替换那些字符(例如破折号)。