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);
}
しかし、私は2番目のものに苦労しています。私は試した:
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
生のリクエストを自分で作成したくありません。
前もって感謝します
ところで。
そもそもアクションを実行するために設定する必要があると考えているため、デフォルトのdllではなく、nugetのビジュアルスタジオ2010とMicrosoft.Data.Services
およびパッケージを使用しています。Microsoft.Data.Services.Client
System.Data.Services
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;