我在 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 a
m: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.Services
包Microsoft.Data.Services.Client
,而不是默认的System.Data.Services
dll,因为我相信我首先需要设置config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
执行操作。