ASP.NET WebService未命中,参数字符串

时间:2016-05-29 01:47:51

标签: c# jquery asp.net asp.net-web-api

我有以下操作代码来接受服务请求:

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中段的某种类型识别......

请解释发生了什么......或者你是如何解决这个问题的。感谢。

1 个答案:

答案 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友好的字符替换那些字符(例如破折号)。