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);
    }

しかし、私は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.ClientSystem.Data.Servicesconfig.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;

4

1 に答える 1

1

UriOperationParameter の代わりに BodyOperationParameter を使用してみてください。アクション パラメーターは、Uri ではなくリクエスト ボディに含まれます。

于 2013-05-22T22:35:15.263 に答える