2011-11-30 48 views
3

我有一個WCF Web服務,當提交無效數據時拋出異常。數據通過使用WebClient對象的HTTP Post提交。如何溝通WCF異常到WebClient

下面是Web服務的代碼:

[WebInvoke(UriTemplate = "update", Method = "POST")] 
public JsonValue Update(HttpRequestMessage message) 
{ 
    var context = new Entities(); 
    dynamic response = new JsonObject(); 

    // in order to retrieve the submitted data easily, reference the data as a dynamic object 
    dynamic data = message.Content.ReadAs(typeof(JsonObject), new[] { new FormUrlEncodedMediaTypeFormatter() }); 

    // retrieve the submitted data 
    int requestId = data.requestId; 
    int statusId = data.statusId; 
    string user = data.user; 
    string encryptedToken = data.token; 
    string notes = data.notes; 

    // retrieve the request with a matching Id 
    var request = context.Requests.Find(requestId); 

    // make sure the request exists 
    if (request == null) 
     throw new FaultException("The supplied requestId does not exist."); 

    // make sure the submitted encrypted token is valid 
    var token = DecryptToken(encryptedToken); 
    if (token == null) 
     throw new FaultException("Invalid security token."); 

    // TODO: Validate other token properties (e.g. email)? 
    if (!request.User.UserName.Equals(token.UserName)) 
     throw new FaultException("Invalid security token."); 

    // additional logic removed ... 
} 

而且這裏是數據提交給Web服務的代碼:

  // use the WebClient object to submit data to the WCF web service 
      using (var client = new WebClient()) 
      { 
       client.Encoding = Encoding.UTF8; 

       // the data will be submitted in the format of a form submission 
       client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; 

       var data = new NameValueCollection(); 

       // prepare the data to be submitted 
       data.Add("requestId", requestId.ToString()); 
       data.Add("statusId", this.StatusId); 
       data.Add("token", token.ToString()); 
       data.Add("user", this.User); 
       data.Add("notes", this.Notes); 

       // submit the data to the web service 
       var response = client.UploadValues(this.Address, data); 
      } 

我不斷收到與消息的異常:"The remote server returned an error: (500) Internal Server Error"client.UploadValues(this.Address, data);

有沒有一種方法可以確保更詳細的信息返回到WebClient

此外,我怎樣才能確保這些異常(在WCF服務)記錄到EventLog? (基本上我只需要知道發生了什麼)。

回答

1

看看HttpResponseException(命名空間Microsoft.ApplicationServer.Http.Dispatcher) - 他們是您可以控制錯誤情況響應的方式。您可以指定狀態碼,並且您可以控制HttpResponseMessage,您可以在其中控制消息正文。

在客戶端,當您撥打WebClient.UploadValues時,請打包該電話並撥打WebException。如果服務返回一個包含非成功狀態代碼的響應(例如,500,400),則WebException的Response屬性將具有您可以在客戶端中讀取的主體。

另一種選擇是使用HttpClient而不是WebClient,在這種情況下,您可以直接查看HttpResponseMessage

+0

謝謝,這個伎倆。 –