WCF REST Web服务如何在参数中传递URL?
解决WCF REST服务传递含特殊字符路径参数的问题
首先得说明,你添加的<pages validateRequest="false" />其实对WCF REST服务没太大作用——这个配置是给ASP.NET Web Forms页面用的,而WCF有自己的请求处理管道,所以得针对WCF和IIS的HTTP运行时来调整配置。
下面是具体的解决步骤:
1. 调整ASP.NET HTTP运行时的路径字符限制
在web.config的<system.web>节点下,修改<httpRuntime>的requestPathInvalidCharacters属性,把默认禁止的冒号(:)和反斜杠(\)移除,因为这两个字符是你路径参数里的关键部分:
<system.web> <!-- 移除默认禁止的:和\,保留其他危险字符限制 --> <httpRuntime requestPathInvalidCharacters="<,>*,%,&" /> </system.web>
2. 配置IIS的请求过滤规则
IIS的requestFiltering模块也会拦截含特殊字符的请求,所以需要在<system.webServer>节点下开启双重转义,并确保没有禁止相关字符的规则:
<system.webServer> <security> <requestFiltering> <!-- 允许双重转义,避免编码后的特殊字符被拦截 --> <allowDoubleEscaping>true</allowDoubleEscaping> </requestFiltering> </security> </system.webServer>
3. 优化参数传递方式(可选但推荐)
直接把路径放在URL路径段里容易触发各种拦截,更稳妥的方式是把DirectoryName改成查询字符串参数,调整你的接口定义:
<OperationContract()> <WebInvoke(Method:="Get", UriTemplate:="GetFileList?DirectoryName={DirectoryName}", RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Wrapped)> Function GetFileList(ByVal DirectoryName as String) As ArrayList
这样请求地址就变成:localhost:49658/Service.svc/GetFileList?DirectoryName=C:\Programs,查询字符串的特殊字符处理限制更少,也更符合REST的最佳实践。
4. 修正服务实现的返回值错误
另外注意你的服务实现代码有个明显问题:接口声明返回ArrayList()(数组),但你实际返回的是字符串,这会导致编译错误,得修正一下,比如:
Public Function GetFileList(ByVal DirectoryName as String) As ArrayList Implements IService.GetFileList Dim resultList As New ArrayList() resultList.Add("------ " & DirectoryName & " ---------") Return resultList End Function
做完这些配置和代码调整后,应该就能正常传递带冒号和反斜杠的路径参数了。
内容的提问来源于stack exchange,提问作者Elddif
相关产品推荐
相关产品推荐

