发布到WCF数据服务5

时间:2012-06-26 16:54:17

标签: json entity-framework wcf-data-services

我正在尝试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

2 个答案:

答案 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数据服务更好,只是说它会起作用。