2011-09-20 2 views
0

내가 그 서비스가있을 때 :전화 WCF 서비스 HttpWebRequest를

[OperationContract] 
ResponseMessage GetData(RequestMessage message); 

경우

class RequestMessage 
{ 
    public string data  
} 

class ResponseMessage 
{ 
    public string data 
} 

string data2 = "" 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/Service.svc/GetData"); 
request.ContentType = "application/json"; 
request.Method = "POST"; 
request.KeepAlive = true; 

using (Stream requestStream = request.GetRequestStream()) 
{ 
    var bytes = Encoding.UTF8.GetBytes(data2); 
    requestStream.Write(bytes, 0, bytes.Length); 
    requestStream.Close(); 
} 

var response = (HttpWebResponse)request.GetResponse(); 
var abc = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

가 데이터 2로 내가 문자열을 전송해야이 서비스를 "mydata을"을 전화 또는 { "message": { "data": "mydata"}}

012 json 형식으로 포장해야합니까?

?? 서비스 측면에서 제대로 얻으려면 클라이언트 쪽에서 데이터를 어떻게 보내야하는지 이해하는 데 문제가 있습니다./

답변

1

서비스 정의 방법에 대해서는 언급하지 않았습니다. 엔드 포인트가 webHttpBinding이고 엔드 포인트 작동이 기본값 인 <webHttp/>을 사용한다고 가정하면 본문 스타일의 기본값은 "Bare"입니다. 즉, 요청에는 매개 변수의 직렬화 된 버전 만 포함되어야합니다. 이 경우 {"data":"hello world"} 문자열을 보낼 수 있습니다.

WCF 서비스의 예상되는 형식을 빠르게 찾으려면 WCF 클라이언트을 사용하여 동일한 계약/바인딩/동작을 사용하고 서버에 메시지를 보내고 캡처하십시오. on fiddler). 예를 들어, 아래 코드는 귀하와 유사한 서버와 요청을 보내는 클라이언트를 보여줍니다.

public class StackOverflow_7492678 
{ 
    public class RequestMessage 
    { 
     public string data; 
    } 
    public class ResponseMessage 
    { 
     public string data; 
    } 
    [ServiceContract] 
    public interface ITest 
    { 
     [OperationContract] 
     ResponseMessage GetData(RequestMessage message); 
    } 
    public class Service : ITest 
    { 
     public ResponseMessage GetData(RequestMessage message) 
     { 
      return new ResponseMessage { data = message.data }; 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     var endpoint = host.AddServiceEndpoint(typeof(ITest), new WebHttpBinding(), ""); 
     endpoint.Behaviors.Add(new WebHttpBehavior()); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     ChannelFactory<ITest> factory = new ChannelFactory<ITest>(new WebHttpBinding(), new EndpointAddress(baseAddress)); 
     factory.Endpoint.Behaviors.Add(new WebHttpBehavior()); 
     ITest proxy = factory.CreateChannel(); 

     Console.WriteLine(proxy.GetData(new RequestMessage { data = "mydata" }).data); 

     ((IClientChannel)proxy).Close(); 
     factory.Close(); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
}