1

我在 Entity Framework 5 DbContext 之上有一个 DataService 类:

public class MyDataService : DataService<MyDbContext>, IServiceProvider
{

    [WebGet]
    public IQueryable<Product> GetProducts1(int category)
    {
        return from p in this.CurrentDataSource.Products
               where p.Category == category
               select p;
    }
}

现在我想将 DbContext 中的方法公开给 DataService 并使用以下示例代码:http ://efactionprovider.codeplex.com/

public class MyDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }

    [NonBindableAction]
    public IQueryable<Product> GetProducts2(int category)
    {
        return from p in this.CurrentDataSource.Products
               where p.Category == category
               select p;
    }

}

访问http://localhost:12345/MyDataService.svc/$metadata show that both methods are known, but the first one hat am:HttpMethod="GET"` 属性

<EntityContainer Name="MyDbContext" m:IsDefaultEntityContainer="true">
    ...
    <FunctionImport Name="GetProducts1" ReturnType="Collection(MyNameSpace.Product)" EntitySet="Products" m:HttpMethod="GET">
        <Parameter Name="category" Type="Edm.Int32" Nullable="false"/>
    </FunctionImport>
    <FunctionImport Name="GetProducts1" ReturnType="Collection(MyNameSpace.Product)" EntitySet="Products">
        <Parameter Name="category" Type="Edm.Int32" Nullable="false"/>
    </FunctionImport>
    ...

我可以通过访问 url 来执行 GetProducts1

http://localhost:12345/MyDataService.svc/GetProducts1?category=1

这对 GetProducts2 不起作用(可能是因为不允许 GET)但我设法通过使用提琴手执行 GetProducts2:

POST: http://localhost:12345/MyDataService.svc/GetProducts1
Request Headers:
    User-Agent: Fiddler
    Host: localhost:12345
    Content-Length: 12
    Content-Type: application/json

Request Body:
    {category:1}

好的,现在这是我的问题:我通过使用服务引用的 Windows 应用程序使用此服务。由于DataServiceContext派生类中的代码生成不涵盖我需要自己调用它们的操作。

对于第一个 ( GetProducts1) 我可以这样做:

    public IEnumerable<Product> GetProducts1(int category)
    {
        var proxy = new MyDataServiceContext(
            "http://localhost:12345/MyDataService.svc");
        var queryString = String.Format("{0}/GetProducts1?category={1}",
            proxy.BaseUri, category);
        var uri = new Uri(queryString, UriKind.RelativeOrAbsolute);
        return proxy.Execute<Product>(uri);
    }

但我正在努力解决第二个问题。我试过了:

    public IEnumerable<Product> GetProducts2(int category)
    {
        var proxy = new MyDataServiceContext(
            "http://localhost:12345/MyDataService.svc");
        var queryString = String.Format("{0}/GetProducts2",
            proxy.BaseUri);
        var uri = new Uri(queryString, UriKind.RelativeOrAbsolute);
        return proxy.Execute<Product>(uri, "POST", false, 
            new UriOperationParameter("category", category));
    }

但我得到一个DataServiceClientException: Content-Type-Header value missing.(状态码 400)

有什么方法可以使用 Execute 方法调用此方法?我宁愿继续使用,DataServiceContext而不是自己提出任何原始请求。

提前致谢

顺便提一句。

我使用的是 Visual Studion 2010 和来自 nuget 的Microsoft.Data.ServicesMicrosoft.Data.Services.Client,而不是默认的System.Data.Servicesdll,因为我相信我首先需要设置config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;执行操作。

4

1 回答 1

1

尝试使用 BodyOperationParameter 而不是 UriOperationParameter。操作参数包含在请求正文而不是 Uri 中。

于 2013-05-22T22:35:15.263 回答