는 내가 엔티티 프레임 워크 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 a
m : 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.Services
및 Microsoft.Data.Services.Client
패키지를 사용하고 있습니다.
실제로이 방법만큼 간단합니다. 고마워. 나는 이것으로 오랜 시간 투쟁했다. 'BodyOperationParameter'의 존재에 대해 배우고 난 후에도 내가 찾는 유일한 예는 http://msdn.microsoft.com/en-us/library/hh859851(v=vs.103).aspx (마지막 코드 블록 하단) 나는이 페이지를 이미 방문했지만 마지막 부분을 간과했다. –