你是怎么逃避的? (句号)或/它没有改变网址的含义?

时间:2014-03-28 11:57:19

标签: angularjs url asp.net-web-api escaping angular-resource

我有一个定义特定路径的Web API 2.0服务:

/api/someEntityGroup/{entityName}

我使用Angular $resource服务来调用此点。

问题是当用户想要在URL中提供具有特定含义的字符的实体名称时:

  • 404未找到 - .(句号),/+
  • 400错误请求 - ?:&%*<>

这些是我遇到过的。可能还有其他一些问题也存在问题,我甚至都不知道它们。(

如果我使用window.escape()功能,这些仍然无法正常工作,但我主要得到404(唯一的例外是*仍然会返回400 Bad请求。)

我的代码

角度资源创建:

.factory("entityResource", ["$resource", function() {
    return $resource("/api/entities/:id", null, {
        search: {
            method: "GET",
            url: "/api/entities/:name",
            isArray: true
        }
    });
}]);

我如何在我的代码中调用它:

entityResource.search({ query: scope.name }, function(data) {
    ...
});

我的Api控制器动作:

[RoutePrefix("/api/entities")]
public class EntitiesController: ApiController
{
    [Route("{searchQuery}")]
    public IEnumerable<Interest> Get(string searchQuery)
    {
        return this.interestService.Search(searchQuery);
    }

    ...
}

1 个答案:

答案 0 :(得分:0)

使用./+个字符时,我可以了解您的404未找到问题。

问题不在于Angular,而在于使用Web API及其解析路由的方式。 Web API将其解释为托管资源(例如静态内容,页面等)的URL将尝试独立解析。

在web.config中设置以下内容以禁用此行为并强制WebAPI通过您的模块运行所有请求:

<system.webServer>
   <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

只是一个警告 - 如果您的Web API与MVC或静态网站一起托管,则不推荐上述内容,因为它会强制所有托管资源(页面,MVC路由,内容[ css,js,images])通过你的API模块,会对性能产生影响。但是,如果所有API都在提供资源路由,我建议启用上述功能。