114

我试图让工作的 URL 是一种风格的 URL:http ://somedomain.com/api/people/staff.33311(就像 LAST.FM 的网站允许在其 RESTFul 和网页 URL 中使用各种标志,例如“ http://www.last.fm/artist/psy'aviah ”是 LAST.FM 的有效 url)。

以下场景有效: - http://somedomain.com/api/people/ - 返回所有人 - http://somedomain.com/api/people/staff33311 - 也可以,但这不是我的m 在我希望 url 接受“点”之后,如下例所示 - http://somedomain.com/api/people/staff.33311 - 但这给了我一个

HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

我已经设置了以下内容:

  1. 控制器“PeopleController”

    public IEnumerable<Person> GetAllPeople()
    {
        return _people;
    }
    
    public IHttpActionResult GetPerson(string id)
    {
        var person = _people.FirstOrDefault(p => p.Id.ToLower().Equals(id.ToLower()));
        if (person == null)
            return NotFound();
    
        return Ok(person);
    }    
    
  2. WebApiConfig.cs

    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
    
        // Web API routes
        config.MapHttpAttributeRoutes();
    
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
    

我已经尝试按照这篇博文http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx的所有提示进行操作,但它仍然无法正常工作。我也认为这很乏味,我想知道是否没有另一个,更好更安全的方式。

我们的 Id 在内部是这样的,所以我们必须找到一种解决方案来以某种方式匹配点,最好是“。”的样式。但如果需要,我愿意接受有关 url 的替代建议......

4

9 回答 9

146

在 URL 后加上斜杠,例如http://somedomain.com/api/people/staff.33311/,而不是http://somedomain.com/api/people/staff.33311.

于 2015-07-28T12:57:46.920 回答
115

在您的web.config文件中进行以下设置应该可以解决您的问题:

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
于 2014-01-08T15:47:34.397 回答
36

我发现在标准之前添加以下内容可以为我解决问题:ExtensionlessUrlHandler

<add name="ExtensionlessUrlHandler-Integrated-4.0-ForApi"
     path="api/*"
     verb="*"
     type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />

我认为名称实际上并不重要,除非您的 IDE(在我的情况下为 Visual Studio)正在管理您的站点配置,它可能会有所帮助。

H/T 到https://stackoverflow.com/a/15802305/264628

于 2016-06-01T21:10:52.620 回答
25

我不知道我到底在做什么,但是在玩了之前的答案之后,我想出了另一个,也许更合适的解决方案:

<system.webServer>
<modules>
    <remove name="UrlRoutingModule-4.0" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
</modules>
</system.webServer>
于 2014-03-17T20:49:32.697 回答
11

我发现我需要做的不仅仅是将runAllManagedModulesForAllRequests属性设置为true. 我还必须确保将无扩展名 URL 处理程序配置为查看所有路径。此外,您还可以添加一项额外的配置设置,这在某些情况下会有所帮助。这是我的工作 Web.config:

<system.web>
    <httpRuntime relaxedUrlToFileSystemMapping="true" />
</system.web>
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <handlers>
        <remove name="WebDAV" />
        <remove name="OPTIONSVerbHandler" />
        <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" />
    </handlers>
</system.webServer>

请特别注意,ExtensionlessUrlHandler-Integrated-4.0path属性设置*为与*.(例如)相反。

于 2016-05-06T19:58:37.413 回答
2

我陷入了这种情况,但/ 在 URL 末尾附加对我来说看起来并不干净。

因此,只需在web.config handlers标签中添加以下内容,您就可以开始使用了。

<add name="Nancy" path="api" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />
于 2018-05-14T08:28:07.850 回答
2

我会在 Web.config 文件中使用它:

<add name="ManagedSpecialNames" path="api/people/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

在标准“ExtensionlessUrlHandler”之前。

例如,就我而言,我把它放在这里:

<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <add name="ManagedFiles" path="api/people/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

因此,您强制此类模式的 URL 由您管理,而不是作为应用程序目录树中的文件进行标准管理。

于 2019-11-06T10:38:22.637 回答
1

我发现这两种方式都适合我:将 runAllManagedModulesForAllRequests 设置为 true 或添加 ExtentionlessUrlHandler,如下所示。最后我选择添加 extensionUrLHandler,因为 runAllManagedModulesForAllRequests 确实对站点有性能影响。

<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <remove name="WebDAV" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" 
       type="System.Web.Handlers.TransferRequestHandler" 
       preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
于 2017-05-19T05:29:10.367 回答
0

我遇到了同样的问题,我所处的环境不应该使用 IIS 和网站配置相关设置。所以我必须通过仅在代码级别进行更改来使其工作。

简单的一点是,在 URL 中最终会出现点字符的最常见情况是,当您从用户那里获得一些输入并将其作为查询字符串或 url 片段传递以将一些参数传递给操作方法中的参数时你的控制器。

public class GetuserdetailsbyuseridController : ApiController
{
     string getuserdetailsbyuserid(string userId)
     {
        //some code to get user details
     }
}

看看下面的 URL,用户输入他的用户 ID 以获取他的个人详细信息:

http://mywebsite:8080/getuserdetailsbyuserid/foo.bar

由于您必须简单地从服务器获取一些数据,我们使用 httpGET动词。使用GET调用时,任何输入参数只能在 URL 片段中传递。

因此,为了解决我的问题,我将操作的 http 动词更改为POST. HttpPOST动词也可以在正文中传递任何用户或非用户输入。所以我创建了一个 JSON 数据并将其传递到 httpPOST请求的正文中:

{
  "userid" : "foo.bar"
}

更改您的方法定义如下:

public class GetuserdetailsbyuseridController : ApiController
{
     [Post]
     string getuserdetailsbyuserid([FromBody] string userId)
     {
        //some code to get user details
     }
}

注意:更多关于何时使用GET动词和何时使用POST动词的信息

于 2017-10-19T02:40:35.043 回答