Вопрос

У меня есть веб -сервис WCF, который бросает исключения, когда отправляются неверные данные. Данные отправляются через HTTP -пост с использованием объекта WebClient.

Вот код для веб -службы:

[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);
           }

Я продолжаю получать исключение с сообщением: "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 напрямую.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top