我正在尝试POST到EntityFramework支持的WCF数据服务,但我得到了:
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数据OK
答案 0 :(得分:1)
如果有效内容具有版本V3(DataServiceVersion),则WCF Data Services 5.0不支持请求(或响应)有效内容的application / json内容类型。在上面的例子中,你没有指定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(这将起作用)无论有效载荷版本。)
答案 1 :(得分: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)
其中Message是C#class:
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数据服务更好,只是说它会起作用。