2012-06-26 159 views
1

我试图张贴到的EntityFramework支持WCF数据服务,但我得到:发布到WCF数据服务5

415 Unsupported Media Type 

我跟着本指南把标题变为我的jQuery POST http://blogs.msdn.com/b/astoriateam/archive/2012/04/11/what-happened-to-application-json-in-wcf-ds-5-0.aspx

这些都是我的头:

POST /webservices/service/service.svc/Activities HTTP/1.1 
Host: www.url.com 
Connection: keep-alive 
Content-Length: 138 
Origin: http://www.url.com 
X-Requested-With: XMLHttpRequest 
MaxDataServiceVersion: 3.0 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5 
Content-Type: application/json; charset=UTF-8 
Accept: application/json;odata=verbose 
Referer: http://www.url.com/sites/site/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8,en-GB;q=0.6 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

这个网站帮助使用的EntityFramework与WCF数据服务 - http://blogs.msdn.com/b/writingdata_services/archive/2011/06/15/entity-framework-4-1-code-first-and-wcf-data-services.aspx

function AddActivity() { 
    var activity = { 
     activity: 
      { 
       "Title": "Test From Code", 
       "Detail": "Code Example", 
       "Started": "2012-06-21T09:00:00", 
       "UserId": 17 
      } 
    }; 

    var url = 'http://www.url.com/webservices/service/service.svc/Activities'; 

    $.ajax({ 
     type: "POST", 
     url: url, 
     data: activity, 
     dataType: "json", 
     contentType: "application/json; charset=utf-8", 
     beforeSend: function (xhr) { 
      xhr.setRequestHeader("Accept", "application/json;odata=verbose"); 
      xhr.setRequestHeader("MaxDataServiceVersion", "3.0"); 
     }, 
     success: function (data) { 
      alert('Success'); 
     }, 
     error: function (err) { 
      alert('Fail\n' + err.statusText); 
     } 
    }); 
} 

我可以读取数据JSON数据行

回答

1

WCF数据服务5.0不支持请求(或响应)应用/ JSON内容类型的有效载荷如果有效载荷具有版本V3(DataServiceVersion)。在上面的例子中,你没有指定DataServiceVersion(你总是应该这样)。在这种情况下,服务器必须以某种方式推断该版本,WCF数据服务服务器将假设它和客户端可以理解的最大版本。由于服务器本身了解V3并且您指定了MaxDataServiceVersion:3.0,这意味着客户端也了解V3,因此假定有效负载是V3有效负载。

V3有效载荷目前不支持application/json,它们只支持application/json; odata = verbose。

查看此博客文章的更多解释:http://blogs.msdn.com/b/astoriateam/archive/2012/04/11/what-happened-to-application-json-in-wcf-ds-5-0.aspx。它谈论GET,但同样的事情适用于POST等。

所以要解决你的问题,修改你的客户端,要么发送DataServiceVersion:2.0(或1.0),如果这是正确的,或者甚至更好地修改它发送Content-Type:application/json; odata = verbose无论有效载荷版本如何工作)。

0

只需使用WCF而不使用任何WCF数据服务组件就能以最少的黑客操作。

发布的最小型背如JSON将自动映射的值,例如,这JSON

{ 
    "name": "1234567890", 
    "amount": "2500.00" 
} 

可以回发到该服务

[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json)] 
public string MethodName(Message message) 

其中消息是C#类:

public class Message 
{ 
    public string name { get; set; } 
    public string amount { get; set; } 
} 

很简单。然后,如果你要处理它作为一个OData的请求,你有更复杂的JSON被张贴,例如(ODataV2):

{ 
"d": [ 
    { 
     "__metadata": { 
      "id": "http://host:54470/ods.svc/MethodName('1234567890')", 
      "uri": "http://host:54470/ods.svc/MethodName('1234567890')", 
      "type": "SomeCompany.Helper.Services.RequestMessage.Message" 
     }, 
     "name": "1234567890", 
     "amount": "2500.00", 
    } 
] 
} 

如果您创建相应的C#类,这样的OData将映射到这些类。这些类与OData一起使用。

public class Message 
{ 
    public ODataResult[] d; 
} 

public class ODataResult 
{ 
    public ODataMetaData __metadata; 
    public string name { get; set; } 
    public string amount { get; set; } 
} 

public class ODataMetaData 
{ 
    public string id; 
    public string uri; 
    public string type; 
} 

json发布的OData将映射到此Message类。这使您可以根据需要“调整”传入消息,这在某些情况下可能需要。

并不是说这比使用WCF数据服务更好,只是说它会起作用。