Я могу использовать следующий код, который отлично подходит для входа в систему с использованием моего веб-API. Однако, когда что-то пошло не так, и возвращается ошибка, я не знаю, как получить конкат HttpResponseMessage. Если я просто использую метод ReadAsStringAsync(), я получаю ошибку в строке, но какой это тип? Если я знаю тип, я могу получить объект.
HttpResponseMessage response = await client.PostAsJsonAsync("api/Login", loginObject);
if (response.IsSuccessStatusCode)
{
var _logonResponse = await response.Content.ReadAsAsync<TokenResponseModel>();
}
else
{
// an error has occured, but what is the type to read?
var test = await response.Content.ReadAsStringAsync();
}
На сервере он возвращается;
BadRequest(ModelState).
Спасибо за любую помощь.
EDIT: С тех пор я решил проблему таким образом;
var value = await response.Content.ReadAsStringAsync();
var obj = new { message = "", ModelState = new Dictionary<string, string[]>() };
var x = JsonConvert.DeserializeAnonymousType(value, obj);
Возвращаемый результат - это объект JSON с свойствами " Message " и " ModelState ".
Значение состояния " ModelState " является объектом, свойства которого являются массивами строк. Список свойств " ModelState " меняется время от времени в зависимости от того, какое свойство является недопустимым.
Следовательно, чтобы получить ответ типа сильного типа, почему бы вам не манипулировать ModelState самостоятельно на стороне сервера, а затем передать объект методу BadRequest()
Вот просто захват сырого json в тексте сообщения об ошибке...
if (!response.IsSuccessStatusCode)
{
dynamic responseForInvalidStatusCode = response.Content.ReadAsAsync<dynamic>();
Newtonsoft.Json.Linq.JContainer msg = responseForInvalidStatusCode.Result;
result = msg.ToString();
}
попробуйте следовать:
try
{
HttpResponseMessage response = await client.PostAsJsonAsync("api/Login", loginObject);
response.EnsureSuccessStatusCode();
var _logonResponse = await response.Content.ReadAsAsync<TokenResponseModel>();
return _logonResponse;
}
catch (Exception ex)
{
throw ex;
}
Попробуйте IOStreamReader. Это vb.net, но это не так сложно конвертировать:
IOStreamReader = New IO.StreamReader(Response.GetResponseStream)
RespStr = IOStreamReader.ReadToEnd
Или
Dim HttpReq As Net.HttpWebRequest = Nothing
Dim HttpStatus As Net.HttpStatusCode = Nothing
HttpResp = CType(HttpReq.GetResponse(), Net.HttpWebResponse)
'verify the response
HttpStatus = HttpResp.StatusCode