2014-09-30 14 views
7

Tôi muốn gửi dữ liệu ở định dạng jason tới dịch vụ wcf để xử lý. Dịch vụ Wcf được phát triển và khi đầu vào jason được gửi tới dịch vụ bằng cách sử dụng trình phát, nó sẽ phát ra lỗi - Máy chủ đã gặp lỗi khi xử lý yêu cầu. Thông báo ngoại lệ là 'Tin nhắn đến có định dạng tin nhắn không mong muốn' Raw '. Các định dạng tin nhắn dự kiến ​​cho hoạt động là 'Xml', 'Json'. Điều này có thể là do WebContentTypeMapper chưa được định cấu hình trên liên kết. Xem tài liệu của WebContentTypeMapper để biết thêm chi tiết. '. Xem nhật ký máy chủ để biết thêm chi tiết.Lỗi dịch vụ WCF - Thư đến có định dạng thư không mong muốn 'Nguyên'. Định dạng tin nhắn dự kiến ​​là '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 

Nếu tôi sử dụng wcftestclient (chế độ gỡ lỗi), nó hoạt động tốt - đoán nó sử dụng xà phòng/xml.

Trả lời

18

Loại nội dung của yêu cầu phải là ứng dụng/json, không áp dụng/jason. Hãy thử thay đổi điều đó và nó sẽ hoạt động.

+1

Cảm ơn !!! Tôi đã không nhận thấy rằng ngay cả sau khi chi tiêu một ngày về điều này! – btsdotnet

+0

Tôi đang gặp phải một vấn đề nữa - tham số đầu vào cho phương thức này là một kiểu phức tạp (mặc dù tôi đã đơn giản hóa nó trong mã trên). Lớp nhân viên chứa một mảng của một kiểu dữ liệu phức tạp khác (class) mà lần lượt có một mảng của một kiểu phức tạp (lớp) khác. Khi tôi gửi đầu vào Json, tôi thấy giá trị của cấp 1 và cấp 2 nhưng giá trị cấp 3 hiển thị trống. Có bất kỳ hạn chế về mức độ làm tổ? Nó hoạt động tốt khi tôi sử dụng xà phòng/xml – btsdotnet

0

Sự cố này vẫn sẽ xảy ra sau khi hiệu chỉnh ở trên NẾU có sự không khớp giữa thứ mà người lập bản đồ loại nội dung đang trả về và RequestFormat.

Mở liên kết của bạn, nếu bạn có

contentTypeMapper="Abc.Service.NewtonsoftCustom.CustomContentTypeMapper 

xác minh rằng những gì các phương pháp

CustomContentTypeMapper(string contentType) 

lợi nhuận trận đấu nói

RequestFormat =WebMessageFormat.Json 

trên OperationContract bạn

Các vấn đề liên quan