0

我正在尝试使用带有 XML 的 REST 将对象发布到 WCF 服务,但我一直被"error: (400) Bad Request"抛出。我知道这个网站上有很多关于同样问题的帖子,但我似乎找不到解决方案。

我的 WCF 服务代码:

iPhoneBookService.cs:

    [OperationContract]
    [WebInvoke( UriTemplate = "/addentry/", 
                Method = "POST",
                BodyStyle = WebMessageBodyStyle.Bare, 
                RequestFormat = WebMessageFormat.Xml, 
                ResponseFormat = WebMessageFormat.Xml)]
    void AddEntry(Contact contact);

PhoneBookService.cs:

    DataPhonebookDataContext dc = new DataPhonebookDataContext();
    public void AddEntry(Contact contact)
    {
        if (contact == null)
        {
            throw new ArgumentNullException("contact");
        }
        dc.Contacts.InsertOnSubmit(contact);

        try
        {
            dc.SubmitChanges();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }           

    }

客户端(ASP 页)代码:

    private WebClient client = new WebClient();
    HttpWebRequest req;
    protected void Page_Load(object sender, EventArgs e)
    {
        req = (HttpWebRequest)WebRequest.Create("http://localhost:1853/PhoneBookService.svc/addentry/");
        req.Method = "POST";
        req.ContentType = "application/xml; charset=utf-8";
        req.Timeout = 30000;
        client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
    }
    protected void btnAddEntry_Click(object sender, EventArgs e)
    {
        var contact = new Contact(); //Contact class from WCF service reference
        contact.LastName = txtLastName.Text;
        contact.FirstName = txtFirstName.Text;
        contact.PhoneNumber = txtPhone.Text;

        //Code using Webclient
        //client.UploadData(new Uri("http://localhost:1853/PhoneBookService.svc/addentry/"), TToByteArray<Contact>(contact));

        //Code using webrequest
        byte[] buffer = TToByteArray<Contact>(contact);
        req.ContentLength = buffer.Length;
        Stream PostData = req.GetRequestStream();
        PostData.Write(buffer, 0, buffer.Length);
        PostData.Close();

        HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
        Encoding enc = System.Text.Encoding.GetEncoding(1252);
        StreamReader loResponseStream =
        new StreamReader(resp.GetResponseStream(), enc);
        string response = loResponseStream.ReadToEnd();
    }
    private byte[] TToByteArray<T>(T item)
    {
        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream ms = new MemoryStream();

        if (!typeof(T).IsSerializable)
        {
            throw new ArgumentException("The type of the argument must be serializable");
        }
        bf.Serialize(ms, item);
        return ms.ToArray();
    }

该类Contact在 中定义,DataContext由 LinqToSQL 类生成。我将Contact类编辑为可序列化的。

4

1 回答 1

1

您创建了一个监听 XML 发布请求的 Web 服务。这意味着请求消息格式必须是 XML。

另一方面,您的客户端以二进制格式序列化合约。尝试使用 XMLSerializer,而不是 BinaryFormatter。

WebMessageBodyStyle.Bare属性不表示二进制数据。它仅表示消息未包含在带有元信息的附加 XML 标记中。

如果你想在你的服务中接收二进制数据,你应该将输入参数声明为流,然后在服务器上不进行自动序列化,你会完全按照客户端发送消息的方式接收消息。

于 2012-11-11T16:44:42.113 回答