【问题标题】:WCF Rest JSON service 400 bad requestWCF Rest JSON 服务 400 错误请求
【发布时间】:2013-02-22 02:03:20
【问题描述】:

所以我写了我的第一个 WCF 项目,似乎它使用我的浏览器和 jquery 工作,但后来我写了一个客户端,事情有点搞砸了...... 实际上似乎我对那个客户端所做的一切都会导致 400 错误的请求响应...... 所以我读了一些帖子,发现一个很好的整理方法是使用提琴手,然后开始四处挑选......

由于提琴手无法识别我的客户,我已经使用我的客户将数据直接发送给它...... https://docs.google.com/file/d/0ByOtHJSZT_GtNHZqTVZMdVVqZEU/edit?usp=sharing 您可以在此处查看屏幕截图。

正如我所见,唯一不同的是一些标题的泄漏(这对我来说似乎并不真正有用),一个使用 content-type 作为 application/jsonp 另一个 text/html(我认为这是主要问题)。 不好的是我在发送请求之前设置了 content-type 标头,但是没有结果,请注意在右侧面板中您仍然可以看到 application/json。 我越来越糊涂了。

    private void SendSelectedFile()
    {
        string url = "http://" + WindowsFormsApplication1.Properties.Settings.Default.HostAddress + "/Service1.svc/rest/PostFileToServer";
        string jsonMsg = "{\"fileContentAsBase64String\":\"" + this.textBox1.Text + "\",\"where\":\"D:\\Temp.dwg\"}";
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(jsonMsg);

        HttpWebRequest wr = WebRequest.Create(new Uri(url)) as HttpWebRequest;
        wr.Method = "POST";
        wr.ContentType = "application/json; charset=utf-8";
        wr.ContentLength = buffer.Length;
        //wr.TransferEncoding = "UTF-8";
        System.IO.Stream rs = wr.GetRequestStream();
        rs.Write(buffer , 0, buffer.Length);
        rs.Close();

        WebResponse response = wr.GetResponse();
    }

这是服务的接口

    [WebInvoke(
        Method = "POST",
        ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "/PostFileToServer"
    )]
    Boolean PostFileToServer(string fileContentAsBase64String, string where);

【问题讨论】:

  • 有了REST,是时候离开WCF了,Web Api就简单多了
  • 我在您链接的屏幕截图中看到了两个请求,都有 200 响应。返回 400 的那个在哪里?
  • 正如我所说的第二个请求是针对总是以 200 响应的提琴手,提琴手无法拦截我的正常请求,很高兴知道为什么。如何使用 Web API 实现服务?你能指出我吗?我喜欢保持简单。
  • 似乎提琴手在拦截对“localhost”的请求时遇到了一些问题,我在更改 iis express 的行为方式时遇到了一些问题。

标签: c# .net wcf bad-request


【解决方案1】:

我测试了您的代码,并将 400 缩小到传递给您的 where 成员的值:

string jsonMsg = "{\"fileContentAsBase64String\":\"" + this.textBox1.Text + "\",\"where\":\"D:\\Temp.dwg\"}";

我猜您正在尝试传递值 D:\Tempdwg,但反斜杠 \T 似乎被服务器解释为转义序列。尝试对该值进行 base64 编码,或对其进行双重转义 \\\\

【讨论】:

  • 该死我现在也到了那里,我想我需要对其进行 urlencode,我将检查 fiddler 原始请求以查看 chrome 是否对其进行了 urlencoded
  • 一个用于 JSON 的双反向固相线和一个用于 c# 我觉得很愚蠢!非常感谢!顺便说一句:你是怎么到那里的?我启用了 .net 源代码步进,但我不太喜欢它。
  • 我启用了WCF Tracing。在您的 Microsoft SDK 文件夹中有一个名为 SVCTraceViewer 的工具,可用于查看跟踪。我将在我的解决方案中附上示例屏幕截图
猜你喜欢
  • 2011-09-29
  • 2013-06-22
  • 2017-08-16
  • 1970-01-01
  • 2012-04-27
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
相关资源
最近更新 更多