【问题标题】:Why RestSharp get 400 - BadRequest while Fiddler get 200 - OK?为什么 RestSharp 得到 400 - BadRequest 而 Fiddler 得到 200 - OK?
【发布时间】:2014-09-23 07:56:33
【问题描述】:

我肯定错过了一点,但你知道为什么我的客户使用 RestSharp (v 104.4.0) 调用会得到 400 - Bad Request 当我同时使用 fiddler 请求时我得到 200 - OK

下面是我的客户端代码:

  public System.IO.Stream OpenRead(string assetId)
    {
        var request = PresentationServer.CreateRequest("/" + CurrentPlatform.Id + "/assets/" + assetId, true, Method.GET);
        var response = RestClient.Execute<SingleResource<Asset>>(request);
        if (response.Data == null)
            return null;

        var asset = response.Data.Resource;

        if (response.Data.Resource.MimeType.Contains("image"))
        {
            var contentUri = response.Data.Links.FirstOrDefault(el => el.Rel == "content");
            if (contentUri == null) throw new Exception("Asset content Uri not found");

            var contentRequest = PresentationServer.CreateRequest(contentUri.Href, true, Method.GET);
            contentRequest.AddHeader("Accept",asset.MimeType);
            contentRequest.AddHeader("Content-Type", asset.MimeType);

            var contentResponse = RestClient.Execute(contentRequest);

            if (contentResponse.StatusCode != HttpStatusCode.OK)
                throw new Exception("Asset content request failed :" + contentResponse.ErrorMessage);

            var stream = new MemoryStream();
            stream.Write(contentResponse.RawBytes, 0, contentResponse.RawBytes.Length);
            return stream;

        }

        return null;
    }

RestSharp 的 ContentResponse.Content 出现这种错误:

System.Web.HttpException (0x80004005):一个潜在的危险 从客户端 (:) 检测到 Request.Path 值。在 System.Web.HttpRequest.ValidateInputIfRequiredByConfig() 在 System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext 上下文)

如果使用来自提琴手作曲家的类似请求,我会得到成功的响应:

【问题讨论】:

  • 我不确定这一点,因为您模糊了部分 URL,但您可以检查您的 URL 是否包含以下字符:' * % & : \ ?'与否,因为它会被视为危险的 URL 路径。
  • "/" + CurrentPlatform.Id + "/assets/" + assetId 到底给出了什么?
  • @reptildarat :你说得对,我的请求是来自我们内部的 PresentationServer.CreateRequest() 方法的格式错误。它创建像这样的网址:“server/api/platformid/http://server/api/platformid/assets/xxxxx/…

标签: c# restsharp


【解决方案1】:

有解决这个问题的好文章在这里看到:Article

您可以在配置文件中更改此行为:

<system.web>
    <httpRuntime requestPathInvalidCharacters="<,>,*,%,&,:,\,?" />
</system.web>

或返回 .Net 2.0 验证:

<system.web>
    <httpRuntime requestValidationMode="2.0" />
</system.web>

【讨论】:

    【解决方案2】:

    这是我们这边的一个错误,错误信息很明确:

    从 客户 (:)

    我们做了一个错误的请求,因为我们将纯 url 添加到根服务器 url:

    http://RESTserver/api/http://RESTserver/api/resources/xxxxx/content
    

    感谢所有花时间帮助我的人。

    【讨论】:

      【解决方案3】:

      HttpWebRequest.DefaultMaximumErrorResponseLength默认值为65536

      你应该考虑增加它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 2018-10-08
        • 1970-01-01
        • 2020-02-09
        • 1970-01-01
        • 1970-01-01
        • 2019-06-05
        相关资源
        最近更新 更多