0

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

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

正如我所看到的,唯一不同的是一些标题的泄漏(这对我来说似乎并不真正有用)并且一个使用内容类型作为应用程序/jsonp另一个文本/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);
4

1 回答 1

2

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

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

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

WCF Trace shows that it had an error deserializing the JSON string, right around the character

于 2013-02-22T09:11:11.537 回答