У меня есть NET.Core API с простым методом тестирования:

public async Task<IActionResult> TestApi()
{
    try
    {
        throw new UnauthorizedAccessException("My custom error");

        return Ok();
    }
    catch (UnauthorizedAccessException ex)
    {
        return StatusCode(401,ex.Message);
    }
    catch (Exception ex)
    {
        throw;
    }

}

Мне нужно получить сообщение от клиента, как это:

var request = WebRequest.Create($"{baseUrl}{url}") as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/json";
request.Expect = "application/json";
request.ContentLength = 0;

if (parameters != null)
{
    request.ContentLength = serializedObject.Length;
    using (var writer = new StreamWriter(request.GetRequestStream()))
    {
        writer.Write(serializedObject);
    }
}

var response = request.GetResponse() as HttpWebResponse;
var responseEncoding = Encoding.GetEncoding(response.CharacterSet);

using (var sr = new StreamReader(response.GetResponseStream(), responseEncoding))
{
    var result = sr.ReadToEnd();
    return JsonConvert.DeserializeObject<T>(result);
}

Теперь request.GetResponse() as HttpWebResponse возвращает меня:

The remote server returned an error: (401) Unauthorized.

enter image description here

Вместо My custom error. Может ли кто-нибудь указать мне правильное направление?

3
danyolgiax 30 Май 2019 в 17:45

2 ответа

Лучший ответ

Вот урезанный пример, который читает ваше пользовательское сообщение. Ваше сообщение возвращается в ответном потоке.

try
{
    var response = request.GetResponse() as HttpWebResponse;
}
catch (WebException ex) // this exception is thrown because of the 401.
{
    var responseStream = ex.Response.GetResponseStream();
    using (var reader = new StreamReader(responseStream))
    {
        var message = reader.ReadToEnd();
    }
}
2
Scott Hannen 30 Май 2019 в 15:16

Вернуть ActionResult

Task<ActionResult>

Затем вы можете обернуть неавторизованную ошибку в UnauthorizedObjectResult

return Unauthorized(new UnauthorizedObjectResult(errorModel));
0
Rav 30 Май 2019 в 15:22
56380537