我有一个定义特定路径的Web API 2.0服务:
/api/someEntityGroup/{entityName}
我使用Angular $resource
服务来调用此点。
问题是当用户想要在URL中提供具有特定含义的字符的实体名称时:
.
(句号),/
,+
?
,:
,&
,%
,*
,<
,>
这些是我遇到过的。可能还有其他一些问题也存在问题,我甚至都不知道它们。(
如果我使用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);
}
...
}
答案 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都在提供资源路由,我建议启用上述功能。