如何将WCF异常传达给网络客户
-
26-10-2019 - |
题
我有一个WCF Web服务,当提交无效的数据时会引发异常。数据是使用WebClient对象通过HTTP帖子提交的。
这是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? (基本上我只需要知道发生了什么)。
解决方案
看一眼 HttpResponseException
(名称空间 Microsoft.ApplicationServer.Http.Dispatcher
) - 它们是您可以控制错误情况响应的方式。您可以指定状态代码,并且可以控制 HttpResponseMessage
, ,您可以控制消息主体。
在客户端,当您致电时 WebClient.UploadValues
, ,包裹那个电话并接听 WebException
. 。如果服务返回具有不成功的状态代码(例如500,400)的响应,则 Response
WebException的属性将具有主体,您可以在其中阅读客户。
另一个选择是使用 HttpClient
而不是 WebClient
, ,在这种情况下,您可以简单地查看 HttpResponseMessage
直接地。
不隶属于 StackOverflow