如果在查询标识符之前省略斜杠,为什么我的请求的文件扩展名 return 404?
Why do my requests with file extensions return 404 if slash is omitted before Query Identifier?
我们有一个使用属性路由的网络 API 服务 运行。当使用不包含文件扩展名的路由发送请求时,它会路由到正确评估查询字符串的正确操作。当我们有一个包含文件扩展名的路由时,如果您不在查询标识符前包含“/”,则会收到 404 Not Found。
例如:
工作:
https://example/api/interview/test/70ac327a-d77b-41da-bf9c-76af8efdfbbaf/Test.docx/?format=Unspecified
未找到:
https://example/api/interview/test/70ac327a-d77b-41da-bf9c-76af8efdfbbaf/Test.docx?format=Unspecified
可能还值得注意的是,带有文件扩展名的路由参数是可选的。
示例路线是:
[HttpPost]
[Route("api/HDCS/Interview/{subscriberId}/{packageId}/{templatename?}")]
public IHttpActionResult Interview(string subscriberId, string packageId, string format = null,
[FromUri] IEnumerable<string> markedVariables = null, string templatename = null,
bool encodeFileNames = false, string retrieveFromHub = null){...}
编辑:
抱歉我也应该提到我们有
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
在我们的 web.config
我在解释 API 解决此问题时需要的一条非常重要的信息中没有包含。我们正在使用 OWIN 并确保 OWIN 模块实际将 URL 的路由扩展传递到我们必须添加到我们的 Startup.cs
文件的 WebApi 上:
builder.UseWebApi(config);
builder.UseStageMarker(PipelineStage.MapHandler); // this line
这已经解决了问题,我们在使用问题中详述的路由时不再收到 404。
修复来源:
https://github.com/domaindrivendev/Swashbuckle/issues/57
我们有一个使用属性路由的网络 API 服务 运行。当使用不包含文件扩展名的路由发送请求时,它会路由到正确评估查询字符串的正确操作。当我们有一个包含文件扩展名的路由时,如果您不在查询标识符前包含“/”,则会收到 404 Not Found。
例如:
工作:
https://example/api/interview/test/70ac327a-d77b-41da-bf9c-76af8efdfbbaf/Test.docx/?format=Unspecified
未找到:
https://example/api/interview/test/70ac327a-d77b-41da-bf9c-76af8efdfbbaf/Test.docx?format=Unspecified
可能还值得注意的是,带有文件扩展名的路由参数是可选的。
示例路线是:
[HttpPost]
[Route("api/HDCS/Interview/{subscriberId}/{packageId}/{templatename?}")]
public IHttpActionResult Interview(string subscriberId, string packageId, string format = null,
[FromUri] IEnumerable<string> markedVariables = null, string templatename = null,
bool encodeFileNames = false, string retrieveFromHub = null){...}
编辑:
抱歉我也应该提到我们有
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
在我们的 web.config
我在解释 API 解决此问题时需要的一条非常重要的信息中没有包含。我们正在使用 OWIN 并确保 OWIN 模块实际将 URL 的路由扩展传递到我们必须添加到我们的 Startup.cs
文件的 WebApi 上:
builder.UseWebApi(config);
builder.UseStageMarker(PipelineStage.MapHandler); // this line
这已经解决了问题,我们在使用问题中详述的路由时不再收到 404。
修复来源: https://github.com/domaindrivendev/Swashbuckle/issues/57