2014-09-30 15 views
7

Jason formatında veriyi işlemek için bir wcf servisine göndermek istiyorum. Wcf hizmeti geliştirilir ve jason girişi fiddler kullanılarak servise gönderildiğinde, bu hata atar - Sunucu, isteği işlerken bir hatayla karşılaştı. İstisna mesajı 'Gelen mesajın beklenmeyen bir mesaj formatı' Ham '. İşlem için beklenen mesaj formatları 'Xml', 'Json'. Bunun nedeni, bir WebContentTypeMapper'ın bağda yapılandırılmamış olması olabilir. Daha fazla ayrıntı için WebContentTypeMapper belgelerine bakın. Daha fazla bilgi için sunucu günlüklerine bakın. Ben wcftestclient (hata ayıklama modu) kullanıyorsanızWCF servis hatası - Gelen mesajın beklenmedik bir mesaj formatı vardır 'Raw'. Beklenen mesaj formatları 'Xml', 'Json'

Service contract 
================ 

public interface IRegisterEmployee 
    { 

     [OperationContract] 
     [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.Bare, ResponseFormat=WebMessageFormat.Json, UriTemplate = "AddEmployee")] 
     bool ProcessEmployee(Employee emp); 
    } 

    [DataContract] 
    public class Employee 
    { 
     [DataMember] 
     public string emp { get; set; } //this is actually a complex type, but simplified here 

    } 

Service class 
============ 
public class RegisterEmployee : IRegisterEmployee 
    { 
     public bool ProcessEmployee(Employee emp) 
     { 
      //do some processing 
      return true; 

     } 

Web.config 
========= 
<services> 
     <service name="Project.RegisterEmployee"> 
     <endpoint address="Rest" behaviorConfiguration="RestfulBehavior" binding="webHttpBinding" name="Rest" contract="Project.IRegisterEmployee" /> 
     <endpoint address="Soap" behaviorConfiguration="" binding="basicHttpBinding" name="Soap" contract="Project.IRegisterEmployee" /> 
     <endpoint address="Mex" behaviorConfiguration="" binding="mexHttpBinding" name="Mex" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost/Project" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 

    <endpointBehaviors> 
     <behavior name="RestfulBehavior"> 
      <webHttp automaticFormatSelectionEnabled="true" /> 
     </behavior> 
    </endpointBehaviors> 

*Fiddler 
====== 
POST; http://localhost/Project/RegisterEmployee.svc/Rest/AddEmployee 
Content-Type: application/jason 
Request Body = {"emp" : "test"}* 

Error - HTTP/1.1 400 Bad Request 

, iyi çalışıyor - bu sabun/xml kullanır sanırım.

cevap

18

talep içerik tipi uygulama/json olmalıdır değil, uygulama/Jason. Bunu değiştirmeyi dene ve işe yaramalı.

+1

Teşekkür üzerinde

RequestFormat =WebMessageFormat.Json 

söylediklerine doğrulamak !!! Bunu bir gün geçirdikten sonra bile farketmedim! – btsdotnet

+0

Bir başka sorunla karşı karşıyayım - yöntem için giriş parametresi karmaşık bir türdür (yukarıdaki kodda bunu basitleştirdim). Çalışan sınıfı, sırayla başka bir karmaşık tip (sınıf) dizisine sahip olan başka bir karmaşık veri türü (sınıfı) dizisini içerir. Json girişini gönderdiğimde, 1. ve 2. seviyenin değerlerini görüyorum ama 3. seviye değerleri boş gösteriyor. Yuvalama seviyesinde herhangi bir sınırlama var mı? Sabun/xml kullandığımda iyi çalışıyor – btsdotnet

0

Yukarıdaki sorun, içerik türü eşleyicinin geri döndüğü ve RequestFormat arasında bir uyumsuzluk olduğunda, bu sorun yine de devam edecektir. senin bağlanmaları üzerine

, varsa

contentTypeMapper="Abc.Service.NewtonsoftCustom.CustomContentTypeMapper 

yöntem

CustomContentTypeMapper(string contentType) 

döner maçlar senin operationcontract