Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何向WebClient传达WCF异常_Wcf_Exception Handling_Webclient_Wcf Web Api - Fatal编程技术网

如何向WebClient传达WCF异常

如何向WebClient传达WCF异常,wcf,exception-handling,webclient,wcf-web-api,Wcf,Exception Handling,Webclient,Wcf Web Api,我有一个WCF web服务,它在提交无效数据时抛出异常。使用WebClient对象通过HTTP Post提交数据 以下是web服务的代码: [WebInvoke(UriTemplate = "update", Method = "POST")] public JsonValue Update(HttpRequestMessage message) { var context = new Entities(); dynamic response = new JsonObject()

我有一个WCF web服务,它在提交无效数据时抛出异常。使用WebClient对象通过HTTP Post提交数据

以下是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 ...
}
            // 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);
           }
下面是向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 ...
}
            // 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);
           }
我不断收到一条异常消息:
“远程服务器返回了一个错误:(500)内部服务器错误”
位于
客户端。上载值(this.Address,data)

是否有办法确保将更详细的信息返回到
WebClient


另外,如何确保这些异常(在WCF服务中)记录到事件日志中?(基本上,我只需要知道发生了什么)。

看一看
HttpResponseException
(名称空间
Microsoft.ApplicationServer.Http.Dispatcher
)-它们是控制错误情况响应的方法。您可以指定状态代码,并且可以控制
HttpResponseMessage
,您可以在其中控制消息正文

在客户端,当您调用
WebClient.UploadValues
时,将该调用包装并捕获
WebException
。如果服务返回带有非成功状态代码的响应(例如,500、400),WebException的
response
属性将具有正文,您可以在客户端中读取该正文

另一种选择是使用
HttpClient
而不是
WebClient
,在这种情况下,您可以直接查看
HttpResponseMessage