0

REST と XML を使用してオブジェクトを 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 でなければならないことを意味します。

一方、クライアントはコントラクトをバイナリ形式でシリアル化します。BinaryFormatter ではなく、XMLSerializer を使用してみてください。

属性はWebMessageBodyStyle.Bareバイナリ データを示しません。メッセージがメタ情報を含む追加の XML タグでラップされていないことを示すだけです。

サービスでバイナリ データを受信する場合は、入力パラメータをストリームとして宣言する必要があります。その後、サーバーで自動シリアル化は行われず、クライアントが送信したとおりにメッセージを受信します。

于 2012-11-11T16:44:42.113 に答える