2012-03-15 32 views
2

У меня есть служба wcf, и я хочу проверить данные проводки. Но параметр моей функции никогда не получает никаких значений.WCF Метод WebInvoke POST

[OperationContract] 
[WebInvoke(UriTemplate = "TestPost", Method = "POST", 
     ResponseFormat = WebMessageFormat.Json, 
     RequestFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
int Test(string value); 

public int Test(string value) //Value stays null 
{ 
    return 0; 
} 

Запрос JSON Я посылаю, построить с помощью Fiddler2

http://localhost:49633/Service1.svc/TestPost 

User-Agent: Fiddler 
Host: localhost:49633 
Content-Length: 42 
Content-type: application/json 

{"value":{"name":"value","name1":"value"}} 

Я хочу, чтобы параметр, который содержит строку JSON, поэтому в основном я создаю запрос JSON, который содержит объект JSON, потому что я хочу для десериализации объекта JSON позже в один из моих пользовательских объектов. Любые идеи, почему параметр value остается равным нулю?

Благодаря

+0

Параметр является строкой, поэтому его значение должно быть строкой тоже. Попробуйте передать «{» значение »:« {\ "name \": \ "value \", \ "name1 \": \ "value \"} "}' вместо этого. Хотя я удивлен, что служба не дает вам ошибку вместо нулевого аргумента. – shambulator

+0

Можете ли вы попытаться удалить BodyStyle до значения по умолчанию, которое WrappedRequest – Rajesh

ответ

4

Я использую метод ниже, чтобы отправить JSON строку службы, определенной выше, и это работает для меня:

Мой сервис:

[WebInvoke(UriTemplate = "TestPost", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)] 
     public int Test(string value) 
     { 
      Console.Write(value); 
      return 1; 
     } 

Мой Клиент:

private string UseHttpWebApproach(string serviceUrl, string resourceUrl, string method, string requestBody) 
     { 
      string responseMessage = null;     
      var request = WebRequest.Create(string.Concat(serviceUrl, resourceUrl)) as HttpWebRequest; 
      if (request != null) 
      {      
       request.ContentType = "application/json"; 
       request.Method = method; 
      } 

      //var objContent = HttpContentExtensions.CreateDataContract(requestBody); 
      if(method == "POST" && requestBody != null) 
      {     
       byte[] requestBodyBytes = ToByteArrayUsingJsonContractSer(requestBody);     
       request.ContentLength = requestBodyBytes.Length; 
       using (Stream postStream = request.GetRequestStream()) 
        postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length); 

      } 

      if (request != null) 
      { 
       var response = request.GetResponse() as HttpWebResponse; 
       if(response.StatusCode == HttpStatusCode.OK) 
       { 
        Stream responseStream = response.GetResponseStream(); 
        if (responseStream != null) 
        { 
         var reader = new StreamReader(responseStream); 

         responseMessage = reader.ReadToEnd(); 
        } 
       } 
       else 
       { 
        responseMessage = response.StatusDescription; 
       } 
      } 
      return responseMessage; 
     } 

private static byte[] ToByteArrayUsingJsonContractSer(string requestBody) 
     { 
      byte[] bytes = null; 
      var serializer1 = new DataContractJsonSerializer(typeof(string)); 
      var ms1 = new MemoryStream(); 
      serializer1.WriteObject(ms1, requestBody); 
      ms1.Position = 0; 
      var reader = new StreamReader(ms1); 
      bytes = ms1.ToArray(); 
      return bytes; 
     } 

Мой запрос к клиенту UseHttpWebApproach выглядит следующим образом:

string serviceBaseUrl = <<your service base url>>; 
string resourceUrl = "/TestPost"; 
string method = "POST"; 
string jsonText = "{\"value\":{\"name\":\"value\",\"name1\":\"value\"}}"; 
UseHttpWebApproach(serviceBaseUrl, resourceUrl, method, jsonText); 

Ниже мой Скрипач Запрос:

POST http://localhost/VDName/AppName/TestPost HTTP/1.1 
Content-Type: application/json 
Content-Length: 54 
Connection: Keep-Alive 

"{\"value\":{\"name\":\"value\",\"name1\":\"value\"}}" 
Смежные вопросы