2009-11-10 2 views
7

webHttpBinding을 사용하는 WCF 서비스 설정 ... 메소드에서 복잡한 유형을 XML로 반환 할 수 있습니다. 복잡한 유형을 매개 변수로 사용하려면 어떻게해야합니까?WCF 복합 유형이 포함 된 나머지 매개 변수

[ServiceContract(Name = "TestService", Namespace = "http://www.test.com/2009/11")] 
public interface ITestService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", 
       BodyStyle = WebMessageBodyStyle.Bare, 
       UriTemplate = "/Person/{customerAccountNumber}, {userName}, {password}, {PersonCriteria}")] 
    Person SubmitPersonCriteria(string customerAccountNumber, 
           string userName, 
           string password, 
           PersonCriteria details); 
} 

UriTemplate은 문자열 만 허용하므로 가장 좋은 방법은 무엇입니까? 아이디어는 클라이언트 응용 프로그램이 사람에 대한 검색 기준과 같이 서비스에 요청을 게시하는 것입니다. 서비스는 데이터를 XML로 포함하는 적절한 객체로 응답합니다.

답변

8

나머지를 사용하여 복잡한 유형을 게시 할 수 있습니다.

[ServiceContract] 
public interface ICustomerSpecialOrderService 
{  
    [OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = "deletecso/")] 
    bool DeleteCustomerOrder(CustomerSpecialOrder orderToDelete); 
} 

이 구현은 다음과 같습니다

public bool DeleteCustomerOrder(CustomerSpecialOrder orderToDelete) 
{ 
    // Do something to delete the order here. 
} 

당신은 WPF 클라이언트에서 메서드를 호출 할 수 있습니다

public void DeleteMyOrder(CustomerSpecialOrder toDelete) 
{ 
    Uri address = new Uri(your_uri_here); 
    var factory = new WebChannelFactory<ICustomerSpecialOrderService>(address); 
    var webHttpBinding = factory.Endpoint.Binding as WebHttpBinding; 
    ICustomerSpecialOrderService service = factory.CreateChannel(); 
    service.DeleteCustomerOrder(toDelete); 
} 

을하거나를 작성뿐만 아니라 HttpWebRequest를로 호출 할 수 있습니다 복잡한 유형을 모바일 클라이언트에서 수행하는 바이트 배열에 적용합니다.

private HttpWebRequest DoInvokeRequest<T>(string uri, string method, T requestBody) 
{ 
    string destinationUrl = _baseUrl + uri; 
    var invokeRequest = WebRequest.Create(destinationUrl) as HttpWebRequest; 
    if (invokeRequest == null) 
     return null; 

    // method = "POST" for complex types 
    invokeRequest.Method = method; 
    invokeRequest.ContentType = "text/xml"; 

    byte[] requestBodyBytes = ToByteArray(requestBody); 
    invokeRequest.ContentLength = requestBodyBytes.Length; 


    using (Stream postStream = invokeRequest.GetRequestStream()) 
     postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length); 

    invokeRequest.Timeout = 60000; 

    return invokeRequest; 
} 
+0

http://blog.hackedbrain.com/archive/2007/10/05/6124.aspx -? – kd7

+0

귀하의 링크가 귀하의 게시물에서 깨져서 내가하는 일을 완전히 말할 수 있는지 확신 할 수 없습니다. REST를 사용하여 복잡한 유형을 게시 할 수 없다는 말입니까? –

+1

휴식 유형을 사용하여 복잡한 유형을 게시하는 방법은 무엇입니까? bool DeleteCustomerOrder 메소드에서 게시물이 제출되면 서비스가 전달 된 CustomerSpecialOrder 객체를 얻는 방법은 무엇입니까? – Excelsior

0

귀하의 옵션 :

  1. 사용 POST 및 임의의 복잡성에 대한 XML 문서를 승인하거나
  2. 사용 GET과 쿼리 기준에 URL 경로를 매핑하는 방법을 그림.

저는 이전 버전을 추천합니다. RESTful하고 덜 해킹 된 느낌입니다. POST는 쿼리를 제출하는 것이고, 응답으로 쿼리 ID를 얻습니다.이 쿼리는 사용자가 제출 한 것과 관련이 있습니다.

REST 아이디어에 따르면 해당 ID로 이동하여 쿼리 결과를 얻을 수 있습니다.

0

REST 서비스 호출에서 JSON 문자열 또는 XML 형식 데이터를 입력 본문으로 전달할 수 있으며 서비스 계약 정의에서 동일한 내용을 언급 할 수 있습니다. 그런 다음 REST 서비스 호출에서 오브젝트를 입력으로 전달할 수 있습니다.

관련 문제