2016-12-21 103 views
1

我想知道如何從WCF Restful服務的POST方法獲取返回值。如果它是GET方法,我能夠獲得返回值。在GET方法中,webClient.DownloadString(url);正在返回結果。但在POST方法的情況下,webClient.UploadString(url,「POST」,data);沒有返回結果,它只是調用Web服務。從POST方法的WCF Restful服務獲取返回值

我見過很多示例,人們只是使用UploadString()方法調用WCF服務post方法,並假定它返回成功。但我想檢查返回值並基於那個顯示適當的消息。

//----------------------------------- WCF RESTful service ----------------------------------- 
[ServiceContract] 
public interface IAppService 
{  
    [OperationContract] 
    [WebInvoke(UriTemplate = "ValidateVisitPIN", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] 
    bool ValidateVisitPIN(VisitPinRequest visitPinRequest); 
} 

public class AppService : IAppService 
{ 
    public bool ValidateVisitPIN(VisitPinRequest visitPinRequest) 
    { 
     //...... 
     if(visitPinRequest.visitPin == 100) 
      return true; 
     else 
      return false; 
    } 
} 
//----------------------------------- WCF client application ----------------------------------- 
//POST method 
using (WebClient webClient = new WebClient()) 
{ 
    VisitPinRequest visitPinRequest = new VisitPinRequest(); 
    visitPinRequest.VisitPin = txtVisitPIN.Text; 

    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(VisitPinRequest)); 
    MemoryStream mem = new MemoryStream(); 
    ser.WriteObject(mem, visitPinRequest); 
    string url = webServiceURL + "ValidateVisitPIN"; 

    string data = Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length); 
    webClient.Headers["Content-type"] = "application/json"; 
    webClient.Encoding = Encoding.UTF8; 
    var returnString = webClient.UploadString(url, "POST", data); 
} 

//Get method 
using (WebClient webClient = new WebClient()) 
{ 
    string url = webServiceURL + "ValidateVisitPIN/" + txtVisitPIN.Text; 
    string outputString = webClient.DownloadString(url); 
    MessageBox.Show(outputString); 
} 

回答

1

請試試這個:

private static T Call<T>(string url, string body, int timeOut = 20) 
{ 
    var contentBytes = Encoding.UTF8.GetBytes(body); 
    var request = (HttpWebRequest)WebRequest.Create(url); 

    request.Timeout = timeOut * 1000; 
    request.ContentLength = contentBytes.Length; 
    request.Method = "POST"; 
    request.Accept = "application/json"; 

    using (var requestWritter = request.GetRequestStream()) 
     requestWritter.Write(contentBytes, 0, (int)request.ContentLength); 

    var responseString = string.Empty; 
    var webResponse = (HttpWebResponse)request.GetResponse(); 
    var responseStream = webResponse.GetResponseStream(); 
    using (var reader = new StreamReader(responseStream)) 
    { 
     reader.BaseStream.ReadTimeout = timeOut * 1000; 
     responseString = reader.ReadToEnd(); 
    } 

    return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responseString); 
} 

那麼你可以這樣調用:

 var input = new 
     { 
      test1="", 
      . 
      . 
      . 
     } 
     var output = Call<bool>(url, Newtonsoft.Json.JsonConvert.SerializeObject(input)); 
+0

感謝您的重播。我無法讓它工作。 – user1396423

+0

你會請張貼錯誤? – David

+0

沒有任何參數的Web服務工作正常。但我需要將json字符串傳遞給Web服務。我得到低於錯誤請求錯誤(400):傳入消息具有意外的消息格式'原始'。預期的操作消息格式是'Xml','Json'。請告訴我如何很好地傳遞參數 – user1396423