在WCF数据服务上请求application / json时请求的媒体类型不受支持

时间:2012-10-19 10:49:20

标签: json wcf wcf-data-services

我正在使用Reflection Provider(http://msdn.microsoft.com/en-us/library/dd728281.aspx)在我现有的类上构建WCF数据服务(使用.net 4.5 VS 2012)。我可以在请求标头中使用“Accept:application / atom + xml”成功访问该服务。但是,在请求标题中将“Accept”更改为“application / json”时,出现“请求不支持的媒体类型”错误。据我所知,WCF数据服务支持JSON,我该怎么做才能在服务上查询json数据?

由于

编辑: 我粘贴下面的代码: 首先我定义了Product类:

[DataServiceKeyAttribute("Id")]
public class Product
{
    public int Id { get; set; }
    public int Price { get; set; }
    public string Name { get; set; }
}

然后我定义了我的ProductContext类:

public class ProductContext
{
    private List<Product> products = new List<Product>();

    public ProductContext()
    {

        for (int i = 0; i < 100; i++)
        {
            var product = new Product();
            product.Id = i;
            product.Name = "ID - " + i.ToString();
            product.Price = i + 100;
            products.Add(product);
        }
    }

    public IQueryable<Product> Products
    {
        get
        {
            return products.AsQueryable();
        }
    }
}

和我的ProductService.svc.cs

[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class ProductsService : DataService<ProductContext>
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {
        // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
        // Examples:
        config.SetEntitySetAccessRule("Products", EntitySetRights.AllRead);
        //config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
    }
}

3 个答案:

答案 0 :(得分:4)

如果您正在使用WCF Data Services 5.0,请查看此博客文章,其中解释了JSON支持的变化:http://blogs.msdn.com/b/astoriateam/archive/2012/04/11/what-happened-to-application-json-in-wcf-ds-5-0.aspx

答案 1 :(得分:2)

tl; dr:添加

的请求标头

MaxDataServiceVersion:2.0

答案 2 :(得分:2)

如果您使用的是较新版本的WCF数据服务,则可能需要使用以下Accept标头:Accept: application/json;odata=verbose,text/plain

这允许对$count等标量查询进行纯文本响应,并指定JSON的详细版本。我正在使用WCF数据服务5.3,这是我发现必要的。我也见过Accept: application/json;odata=light,但我个人并不需要,因为odata的冗长版本工作正常。