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

时间:2015-06-09 09:04:30

标签: c# asp.net asp.net-web-api

我正在创建一个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除了那些特殊字符外都有效。但如果你不这么认为,请告诉我你还需要知道什么 另一个注意事项:我并没有试图找到在网址中允许它的方法,我只是在寻找专门处理错误的方法。

3 个答案:

答案 0 :(得分:2)

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

<httpRuntime relaxedUrlToFileSystemMapping = "true" />

MSDN Linkhere it is在上下文中。

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

编辑:如果您只想在单个方法的请求字符串中允许冒号,您始终可以使用[ValidateInput(false)]修饰该操作方法,详见this answer of mine中的详细说明。这意味着您无需在web.config中降级请求验证。

答案 1 :(得分:0)

我会在他们的“最终用户”表示中避免网络广告中的字符串。

如果您确实需要传递文本,那么将其作为POST请求的参数传递会有所帮助。这个approch肯定适用于任何字符串

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

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

答案 2 :(得分:0)

您可以实现ExceptionFilterAttribute。例如:

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

此属性可用于操作方法,控制器或全局。但是不要忘记在启动时注册此过滤器。 更多细节可以在这里找到:Exception Handling in ASP.NET Web API