2011-09-20 89 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” 或我应该用json格式包装它:{“message”:{“data”:“mydata”}}

?? 我有问题了解如何发送数据在客户端上发布以正确地在服务端获得它:/

回答

1

您没有提及如何定义服务。假设您的端点使用webHttpBinding,并且端点行为的<webHttp/>具有默认值,那么正文样式的默认值为“Bare”,这意味着请求应该只包含序列化的参数版本。对于这种情况,您可以发送字符串{"data":"hello world"}

如果您想快速找到WCF服务的预期格式,可以使用WCF 客户端,使用相同的合同/绑定/行为,并将消息发送到服务器(并捕获它在提琴手)。例如,下面的代码显示了一个类似于您的服务器,以及一个向其发送请求的客户端。

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