2013-09-06 4 views
2

기본적으로 일부 모바일 응용 프로그램에서 소비 될 WCF resful 서비스를 개발 중입니다. POST를 통해 DataContract 개체 [실제로 개체 목록을 보내야] 개체와 다른 단일 ID를 문자열로 보내려고합니다. 내 질문은 아마도 DataContract 개체 및 단일 문자열을 받아들이 기 위해 내 함수를 정의하는 경우입니까? 인터페이스 선언 : 함수의WCF RESTFUL 웹 서비스의 매개 변수로 DataContract 개체를 보내려면 어떻게해야합니까?

[ServiceContract] 
    public interface IService1 
    { 

     [OperationContract] 
     [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetDataUsingDataContract/{id}")] 
     CompositeType GetDataUsingDataContract(string id, CompositeType composite); 


    } 

    [DataContract] 
    public class CompositeType 
    { 
     bool boolValue = true; 
     string stringValue = "Hello "; 

     [DataMember] 
     public bool BoolValue 
     { 
      get { return boolValue; } 
      set { boolValue = value; } 
     } 

     [DataMember] 
     public string StringValue 
     { 
      get { return stringValue; } 
      set { stringValue = value; } 
     } 
    } 

실제 정의 :

다음

내 코드입니다

public CompositeType GetDataUsingDataContract(string id, CompositeType composite) 
     { 

      if (composite == null) 
      { 
       throw new ArgumentNullException("composite"); 
      } 
      if (composite .BoolValue) 
      { 
       composite .StringValue += "- Suffix and the id is"+id; 
      } 
      return report; 
     } 

내가 피들러에서 보내려고하고있는 JSON 개체입니다

{"BoolValue":true,"StringValue":"sdfsdfsf"} 

Fiddler snap when sending the request Fiddler snap of the output 위의 내용은 서비스를 테스트하는 피들러의 스냅입니다. 인터넷 검색이 끝나면 클라이언트가 실제로 웹 서비스 참조를 사용하여 DataContract 유형을 가져오고 json으로 요청 본문으로 보내기 전에 다음 링크를 얻었습니다. 그렇다면 필라델피아 필자의 시험은 왜 성공하지 못합니까? http://dotnetmentors.com/wcf/wcf-rest-service-to-get-or-post-json-data-and-retrieve-json-data-with-datacontract.aspx

아무도 제안 할 수 없습니까?

의 Web.config은 울부 짖는 소리입니다 :

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service name="JSONWebService.Service1" behaviorConfiguration="JSONWebService.Service1Behavior"> 
     <endpoint address="../Service1.svc" 
      binding="webHttpBinding" 
      contract="JSONWebService.IService1" 
      behaviorConfiguration="webBehaviour" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="JSONWebService.Service1Behavior"> 

      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="webBehaviour"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 

답변

12

는이 시나리오가 작동하도록하기 위해 수행해야 할 몇 가지가있다.

가 연결된 샘플에서 적응이 예 (도시 된 바와 같이

우선, 서비스 계약하면 래핑 로 설정 WebInvoke의 특성 BodyStyle 파라미터 여러 매개 변수를 갖는 방법을 표시해야 ) http://dotnetmentors.com/wcf/wcf-rest-service-to-get-or-post-json-data-and-retrieve-json-data-with-datacontract.aspx시에 : 장소에이 속성을 매개 변수로

[OperationContract] 
[WebInvoke(UriTemplate = "/PlaceOrder", 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json, Method = "POST", 
    BodyStyle = WebMessageBodyStyle.Wrapped)] 
bool PlaceOrder(string id, OrderContract order); 

당신은 당신의 클라이언트에서 하나의 문자열로 여러 웹 메소드 매개 변수를 포장해야합니다. 익명 메소드의 필드 이름은 웹 메소드의 매개 변수 이름과 일치하는지

var requestdata = new 
    { 
    id = order.OrderID, 
    order = order 
    }; 
    string data2 = JsonConvert.SerializeObject(requestdata); 

참고 : 다음 예는 C#에서이 작업을 수행하는 방법을 보여줍니다.

{"id":"10560","order":{"OrderID":"10560","OrderDate":"06/09/2013 12:29:04","ShippedDate":"16/09/2013 12:29:04","ShipCountry":"Uganda","OrderTotal":"781"}}

당신은 JSON을 테스트 할 수 있어야한다 :

는 참고로, JSON이 당신이 ID를 주문 JSON 문자열 개체를 볼 수있는이 같은 모습을 생산하고 귀하의 예를 들어 피들러 에서이 형식으로.

[DataContract] 
public class OrderContract 
{ 
    [DataMember] 
    public string OrderID { get; set; } 

    [DataMember] 
    public string OrderDate { get; set; } 

    [DataMember] 
    public string ShippedDate { get; set; } 

    [DataMember] 
    public string ShipCountry { get; set; } 

    [DataMember] 
    public string OrderTotal { get; set; } 

    [DataMember] 
    public bool Shipped { get; set; } 

    [DataMember] 
    public DateTime DeliveredDate { get; set; } 
} 
이 문제는 여기에있다

:


부울날짜 시간 속성을 포함하는 DataContract을 사용하여 다른 데이터 유형

처리에 대한 답을 확장 거래하는 경우 DateTime 그리고 JSON이 WCF RESTful 서비스가 역 직렬화 할 수있는 형식인지 확인하십시오. -이 다음과 같은 JSON 생산

OrderContract order = new OrderContract 
{ 
    OrderID = "10560", 
    OrderDate = DateTime.Now.ToString(), 
    ShippedDate = DateTime.Now.AddDays(10).ToString(), 
    ShipCountry = "India", 
    OrderTotal = "781", 
    Shipped = true, 
    DeliveredDate = DateTime.Now 
}; 

DataContractJsonSerializer ser = 
     new DataContractJsonSerializer(typeof(OrderContract)); 
MemoryStream mem = new MemoryStream(); 
ser.WriteObject(mem, order); 
string data = 
    Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length); 

var requestdata = new 
{ 
    id = order.OrderID, 
    order = order 
}; 
JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings 
{ 
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat 
}; 
string data2 = JsonConvert.SerializeObject(requestdata, microsoftDateFormatSettings); 
WebClient webClient = new WebClient(); 
webClient.Headers["Content-type"] = "application/json"; 
webClient.Encoding = Encoding.UTF8; 
webClient.UploadString("http://localhost:61966/OrderService.svc/PlaceOrder", "POST", data2); 

참고 JSON 시리얼 설정 :이 내가 클라이언트에서이 코드를 사용하여 작동하도록하려면

{"id":"10560","order":{"OrderID":"10560","OrderDate":"10/09/2013 16:15:30","ShippedDate":"20/09/2013 16:15:30","ShipCountry":"India","OrderTotal":"781","Shipped":true,"DeliveredDate":"\/Date(1378826130655+0100)\/"}} 
+0

안녕 @Dominic 보내는 여러 PARAM 내 차 관심사입니다 - 내 첫 번째 문제는 POST를 통해 DataContract를 json으로 보내고 자동으로 DataContract에 직렬화 해제하는 것입니다. 여전히 운이 없다! – marifrahman

+0

DataContract를 웹 메서드의 인수에 대한 스트림으로 바꿀 때 작동합니다! web.config 파일을 추가 했으므로 여기서 아무것도 놓치지 않았습니다. – marifrahman

+0

안녕하세요 @marifrahman. ServiceContract에 RequestFormat 및 ResponseFormat 매개 변수가 모두 있습니까? 나는 당신이 게시 한 코드에서 "RequestFormat = WebMessageFormat.Json"을 볼 수 없다 ... –