2011-11-30 38 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

谢谢,这个伎俩。 –