2016-11-18 1 views
0

Я создал службу RESTful WCF и пытаюсь передать класс в качестве параметра в запрос POST с использованием Fiddler, но столкнулся с такими ошибками, как: «HTTP/1.1 400 Bad Request»Передача объекта класса в качестве входного параметра службе RESTful WCF с запросом POST

Интерфейс - IXmlService.cs

<code> 

    [ServiceContract()] 
     public interface IXmlService 
     { 
      [OperationContract(Name = "Read")] 
      [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "/Read", BodyStyle = WebMessageBodyStyle.Wrapped)] 
      bool ReadData(Order data); 

      [OperationContract(Name = "Generate")] 
      [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "/Generate/")] 
      bool GenerateXml(); 
     } 
</code> 

по осуществлению - XmlService.cs

<code> 

    public class XmlService : IXmlService 
     { 
      public bool ReadData(Order data) 
      { 
       bool result = false; 
       var path = "@C:\\order.xml"; 
       XmlSerializer serializer; 
       TextWriter writer; 

       try 
       { 
        if (data != null) 
        { 
         //serializer = new XmlSerializer(typeof(Order), new XmlRootAttribute("HEADER")); 
         serializer = new XmlSerializer(typeof(Order)); //No need to provide XmlRootAttribute as I have defined it on Order Model. 
         writer = new StreamWriter(path); 
         serializer.Serialize(writer, data); 
         result = true; 
        } 
       } 
       catch (Exception) 
       { 
        throw; 
       } 
       return result; 
      } 

      public bool GenerateXml() 
      { 
       throw new NotImplementedException(); 
      } 
     } 

</code> 

Модель данных - Order.cs

<code> 

    [XmlRootAttribute("OrderDetails", Namespace = "http://www.ProofOfConcept.com", IsNullable = false)] 
     [DataContract] 
     public class Order 
     { 
      // The XmlArrayAttribute changes the XML element name 
      // from the default of "OrderedItems" to "Items". 
      [XmlElement("OrderId")] 
      [Key] 
      [DataMember] 
      public int OrderId { get; set; } 

      [DataMember] 
      public string Owner { get; set; } 

      // Setting the IsNullable property to false instructs the 
      // XmlSerializer that the XML attribute will not appear if 
      // the City field is set to a null reference. 
      [XmlElementAttribute(IsNullable = false)] 
      [DataMember] 
      public string Info { get; set; } 

      [DataMember] 
      public string Recipient { get; set; } 

      //[DataMember] 
      //public DateTime CreatedOn { get; set; } 
     } 

</code> 

Web.config

<code> 

     <system.serviceModel> 
     <services> 
      <service name="WCF_XML_Service.XmlService" behaviorConfiguration="ServiceBehavior"> 
      <!-- Service Endpoints --> 
      <host> 
       <baseAddresses> 
       <add baseAddress="http://localhost:16999"/> 
       </baseAddresses> 
      </host> 

      <endpoint address="/xml/" binding="webHttpBinding" contract="WCF_XML_Service.IXmlService" behaviorConfiguration="Web"/> 
      </service> 
     </services> 

     <behaviors> 
      <serviceBehaviors> 
      <behavior name="ServiceBehavior"> 
       <!-- To avoid disclosing metadata information, set the values below to false before deployment --> 
       <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
       <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
       <serviceDebug includeExceptionDetailInFaults="false"/> 
      </behavior> 
      </serviceBehaviors> 

      <endpointBehaviors> 
      <behavior name="Web"> 
       <webHttp helpEnabled="true"/> 
      </behavior> 
      </endpointBehaviors> 
     </behaviors> 

</code> 

Я пробовал различные подходы путем преобразования привязки к 'WebHttpBinding' в web.config. Кроме того, я попытался добавить «BodyStyle = WebMessageBodyStyle.Wrapped» в атрибут WebInvoke, но все же не смог воспользоваться сервисом с помощью скрипача.

Скрипач Запрос:

<code> 
Url - http://localhost:16999/XmlService.svc/xml/Read 
Method - POST 
Request Header: 
User-Agent: Fiddler 
Host: localhost:16999 
Content-Type: text/xml 
Content-Length: 155 

Request Body: 
    { 
    "OrderId": "1", 
    "Owner": "Sam Shipping", 
    "Info": "First delivery shipment", 
    "Recipient": "Singapore Shipping Corporation" 
    } 
    </code> 
+0

http://stackoverflow.com/questions/40505971/wcf-method-not-erroring-but-not-receiving-my -json/40506041 # 40506041 –

+0

@Div, если вы получаете HTTP 400, тогда код службы не попадает. –

+0

@KirkBroadhurst, да, дайте мне знать. –

ответ

0

Ну, после того, как тратить три дня я наконец понял ошибку, которая «Content Type»: Я использую «Content-Type: текст/XML» для данных JSON, который должен быть "Content-Type : text/json ".


Guess мне нужно очистить свои очки на ежедневной основе теперь :)

0

Использование OrderId вместо Id передать его Guid вместо int. Если это не поможет, сделайте CreatedOn временно нулевым DateTime и удалите его из тела POSTs, на всякий случай это формат даты. Если вы не можете изменить CreatedOn, передайте «некритическое» значение, например «1/1/2013 ...» (день и месяц < = 12).

Надеюсь, это поможет.

+0

Я попытался преобразовать свою модель, преобразовывая Id в OrderId и как int. Также удалил свойство CreatedOn, но все еще получал сообщение «Ошибка HTTP/1.1 400 Bad Request». Проходящий JSON - { «OrderId»: «1», «Владелец»: «Sam Shipping», «Информация»: «Первая доставка», «Получатель»: «Сингапурская судоходная корпорация» } –

Смежные вопросы