url中的冒号(:)导致asp.net中出错

我正在创建一个webAPI,当我在请求字符串中包含冒号(:)时,

http:// localhost:49579 / api / mycontroller / :

我收到此错误:

从客户端(:)检测到潜在危险的Request.Path值。
[HttpException(0x80004005):从客户端(:)检测到一个潜在危险的Request.Path值。] System.Web.HttpRequest.ValidateInputIfRequiredByConfig()+9673044 System.Web.PipelineStepManager.ValidateHelper(HttpContext context)+53

我不打算在api的实际请求中包含特殊字符,但如果某些不好的用户在请求中输入特殊字符,则会导致错误。

问题:如何在API端处理此错误? 有什么办法吗? 或者我应该给开发人员一个关于这个问题的说明?

注意:我无法控制将要访问API的未来客户端。 我正在使用Visual Studio 2012 for Web; .Net 4.0版; ASP.Net WebApi; 和C#; 我认为代码对我的情况来说是不必要的,Api除了那些特殊字符外都有效。 但如果你不这么认为,请告诉我你还需要知道什么。
另一个注意事项:我并没有试图找到在url中允许它的方法,我只是想找到专门处理错误的方法。

如果您确实想要允许它,请尝试在web.config中设置relaxedUrlToFileSystemMapping = true

  

MSDN链接 , 这里是在上下文中。

或者,进行此配置更改,然后选择返回相关的错误消息,或重定向它们或您想要执行的任何操作。

编辑:如果您只想在单个方法的请求字符串中允许冒号,您可以随时使用[ValidateInput(false)]修饰该Action方法,详见本答案中的详细说明。 这意味着您无需在web.config中降级请求validation。

您可以实现ExceptionFilterAttribute。 例如:

 public class HttpExceptionFilterAttribute : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext actionExecutedContext) { if (actionExecutedContext.Exception is HttpException) { actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.BadRequest); } } } 

此属性可用于操作方法,控制器或全局。 但是不要忘记在启动时注册此filter。 可以在此处找到更多详细信息: ASP.NET Web API中的exception处理 。

我会在他们的“最终用户”表示中避免web pathes中的字符串。

如果你真的需要传递文本,那么将它作为POST请求的参数传递会有所帮助。 这个approch将确保任何字符串

如果您必须通过GET请求执行此操作,请注意一些额外的编码/解码逻辑,以帮助您跨越Request.Path限制。 (这里我的意思是将原始字符串转换为某个友好的URL字符串的逻辑,并且在控制器端将对url友好字符串解码为原始字符串)。 但老实说,我并不喜欢这种方法,因为通过解码你得到一个字符串,将其作为url的一部分插入后会被误解。

如果您的文本是服务器上“字典”的条目,那么我将整数Id字段添加到您的实体的“字典”中,并使用实体ID作为您的web.API的参数。