NF Khan Ответов: 1

Метод WCF post, возвращает 400 плохих запросов


Я вижу, что есть много ответов на один и тот же вопрос, но я не могу решить свой, Может ли кто-нибудь из вас пройти через мой код и решить мою проблему, пожалуйста. Я создал службу WCF как показано ниже метод POST

Интерфейс (iComplaints. cs)
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare,     ResponseFormat = WebMessageFormat.Json, UriTemplate = "/insertcomplaint")]
Stream InsertComplaint(ComplaintData data);

Класс (жалобы. cs)
public Stream InsertComplaint(ComplaintData data)
{
    //the code
}

Класс DataContract (ComplaintData)
public class ComplaintData
{
   [DataMember]
    public string ComplaintID { get; set; }
    [DataMember]
    public string EntryBy { get; set; }
}

Я разместил сервис локально, и когда я пытаюсь использовать его с помощью приведенного ниже метода клиента, он дает мне 400 (плохой запрос)
void PostComplaint()
    {
        HttpWebRequest req = null;
        HttpWebResponse res = null;
            string url = "http://localhost:28522/Complaints.svc/insertcomplaint";

            ComplaintData iData = new ComplaintData();
            iData.ComplaintID = txtComplaintID.Text;
            iData.EntryBy = txtEntryBy.Text;

            req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "POST";
            req.ContentType = "application/json"; 
            req.Headers.Add("SOAPAction", url);

            using (var streamWriter = new StreamWriter(req.GetRequestStream()))
            {
                streamWriter.Write(iData);
            }

            res = (HttpWebResponse)req.GetResponse();
            using (var streamReader = new StreamReader(res.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
                TextBox1.Text = result;
            }
    }

Веб-конфигурация службы WCF
<service behaviorConfiguration="ServiceBehavior" name="Complaints">
    <endpoint address="" behaviorConfiguration="webHttp" binding="webHttpBinding" contract="IComplaints" />
   <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
  </service>

Пожалуйста, кто-нибудь, помогите.

Что я уже пробовал:

Без особого успеха я попытался изменить стиль тела
WebMessageBodyStyle.WrappedRequest

Я также попытался отправить запрос json в виде строки, но это привело к тому, что входной параметр был равен null в методе post.

1 Ответов

Рейтинг:
5

NF Khan

Я решил это сам
В моем клиенте я изменился с

void PostComplaint()
    {
        HttpWebRequest req = null;
        HttpWebResponse res = null;
            string url = "http://localhost:28522/Complaints.svc/insertcomplaint";
 
            ComplaintData iData = new ComplaintData();
            iData.ComplaintID = txtComplaintID.Text;
            iData.EntryBy = txtEntryBy.Text;
 
            req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "POST";
            req.ContentType = "application/json"; 
            req.Headers.Add("SOAPAction", url);
 
            using (var streamWriter = new StreamWriter(req.GetRequestStream()))
            {
                streamWriter.Write(iData);
            }
 
            res = (HttpWebResponse)req.GetResponse();
            using (var streamReader = new StreamReader(res.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
                TextBox1.Text = result;
            }
    }


к
void PostComplaint()
    {
    string url = "http://localhost:28522/Complaints.svc/insertcomplaint";
               Uri uri = new Uri(url);

               req = (HttpWebRequest)WebRequest.Create(uri);
               req.Method = "POST";
               req.ContentType = "application/json";
               req.Headers.Add("SOAPAction", url);

//Commented
 //ComplaintData iData = new ComplaintData();
            //iData.ComplaintID = txtComplaintID.Text;
            //iData.EntryBy = txtEntryBy.Text;

//Added
               var iData = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(new { ComplaintID = txtComplaintID.Text, EntryBy = txtEntryBy.Text });
//
               using (var streamWriter = new StreamWriter(req.GetRequestStream()))
               {
                   streamWriter.Write(iData);
               }

               res = (HttpWebResponse)req.GetResponse();
               using (var streamReader = new StreamReader(res.GetResponseStream()))
               {
                   var result = streamReader.ReadToEnd();
                   TextBox1.Text = result;
               }
}


Member 11181064

Спасибо за ваш пост. Это спасло мне жизнь.