2013-05-21 1 views
1

는 내가 엔티티 프레임 워크 5 DbContext의 상단에 DataService의 클래스가 있습니다 :소비 WCF 데이터 서비스 작업 공급자

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

지금 내가 DataService에 내 DbContext에서 방법을 노출 할이 샘플 코드를 사용 : 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 = attribut` "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> 
    ... 

나는 (허용되지 GET propably 때문에) GetProducts2 작동하지 않는 URL

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

에 액세스하여 GetProducts1을 실행할 수 있습니다하지만 피들러 사용하여 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 파생 클래스의 코드 생성은 내가 직접 호출해야하는 작업을 다루지 않습니다.

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

는하지만 두 번째 고민입니다 : 내가 할 수있는 첫 번째 (GetProducts1)에 대한

. 나는 시도 :

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)

내가이 방법을 실행하여이 메소드를 호출 할 수있는 방법이 있습니까? DataServiceContext을 계속 사용하고 원시 요청을 직접 작성하지 않는 것이 좋습니다.

BTW 사전에

감사합니다. 내가 처음에 작업을 실행하기위한 config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;을 설정해야합니다 생각하기 때문에

나는, 시각적 studion 2010 nuget보다는 기본 System.Data.Services DLL을에서 Microsoft.Data.ServicesMicrosoft.Data.Services.Client 패키지를 사용하고 있습니다.

답변

1

UriOperationParameter 대신 BodyOperationParameter를 사용해보십시오. 액션 매개 변수는 Uri 대신 요청 본문에 포함됩니다.

+0

실제로이 방법만큼 간단합니다. 고마워. 나는 이것으로 오랜 시간 투쟁했다. 'BodyOperationParameter'의 존재에 대해 배우고 난 후에도 내가 찾는 유일한 예는 http://msdn.microsoft.com/en-us/library/hh859851(v=vs.103).aspx (마지막 코드 블록 하단) 나는이 페이지를 이미 방문했지만 마지막 부분을 간과했다. –