Json 过帐到WCF数据服务5

Json 过帐到WCF数据服务5,json,entity-framework,wcf-data-services,Json,Entity Framework,Wcf Data Services,我试图发布到EntityFramework支持的WCF数据服务,但我得到: 415 Unsupported Media Type 我按照此指南将标题放入jQuery帖子中 以下是我的标题: 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-Reques

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

415 Unsupported Media Type
我按照此指南将标题放入jQuery帖子中

以下是我的标题:

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数据服务结合使用-


我可以读取数据JSON data OK

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

V3有效负载目前不支持application/json,只支持application/json;odata=冗长

有关更多说明,请参阅此博客文章:。它谈论GET,但同样的事情也适用于POST等


因此,要解决您的问题,请修改您的客户机以发送DataServiceVersion:2.0(或1.0)(如果正确的话),或者更好地修改它以发送内容类型:application/json;odata=verbose(无论有效负载的版本如何都有效)。

WCF Data Services 5.0不支持请求(或响应)有效负载的应用程序/json内容类型,前提是有效负载的版本为V3(DataServiceVersion)。在上面的例子中,您没有指定DataServiceVersion(顺便说一句,您总是应该指定)。在这种情况下,服务器必须以某种方式推断版本,WCF数据服务服务器将假定其和客户端理解的最大版本。由于服务器本身理解V3,并且您指定了MaxDataServiceVersion:3.0,这意味着客户端也理解V3,因此它假定负载是V3负载

V3有效负载目前不支持application/json,只支持application/json;odata=冗长

有关更多说明,请参阅此博客文章:。它谈论GET,但同样的事情也适用于POST等


因此,要解决您的问题,请修改您的客户机以发送DataServiceVersion:2.0(或1.0)(如果正确的话),或者更好地修改它以发送内容类型:application/json;odata=verbose(无论有效负载的版本如何,它都能工作)。

只需使用最少的黑客攻击,使用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类:

很简单。然后,如果您想将其作为OData请求处理,则需要发布更复杂的JSON,例如(ODataV2):

如果您创建相应的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将映射到此消息类。这为您提供了一种根据需要“塑造”传入消息的方法,在某些情况下可能需要这样做


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

只是用最少的黑客攻击做到了这一点,使用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类:

很简单。然后,如果您想将其作为OData请求处理,则需要发布更复杂的JSON,例如(ODataV2):

如果您创建相应的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将映射到此消息类。这为您提供了一种根据需要“塑造”传入消息的方法,在某些情况下可能需要这样做

没有说这比使用WCF数据服务更好,只是说它会起作用