вызов службы wcf по HttpWebRequest - PullRequest
       9

вызов службы wcf по HttpWebRequest

0 голосов
/ 21 сентября 2011

Когда я получу эту услугу:

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

в качестве data2 я должен отправить строку "mydata" или обернуть ее в формате json: {"message": {"data": "mydata"}}

?? У меня проблема с пониманием того, как следует отправлять данные на стороне клиента по почте, чтобы получить их правильно на стороне службы: /

1 Ответ

1 голос
/ 21 сентября 2011

Вы не упомянули, как определяется услуга.Предполагая, что ваша конечная точка использует webHttpBinding, а поведение конечной точки - <webHttp/> со значениями по умолчанию, тогда значением по умолчанию для стиля тела будет «Голый», что означает, что запрос должен содержать только сериализованную версию параметра.В этом случае вы можете отправить строку {"data":"hello world"}.

. Если вы хотите быстро найти ожидаемый формат для службы WCF, вы можете использовать WCF client , используятот же контракт / привязка / поведения, и отправить сообщение на сервер (и перехватить его на 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...