HttpResponseMessage.Content.ReasAsString возвращает пустую строку - PullRequest
1 голос
/ 14 июня 2019

У меня есть WS, который я называю так:

HttpResponseMessage response = await client.PostAsync(url, new StringContent(json));

WS сгенерирует исключение (запрещено), и в моем приложении Blazor, сделавшем вызов PostAsync, я получу HttpResponseMessage скод ответа 405, не уверен, почему его 405, это должно быть 403. (Почтальон возвращает 403).

Я включил CORS ( ServiceStack код):

Plugins.Add(new CorsFeature(allowedOrigins: "*",
  allowedMethods: "GET, POST, PUT, DELETE, OPTIONS",
  allowedHeaders: "*",
  allowCredentials: true));

Это какой-то Console.Writeline, который я сделал, перед PostAsync:

enter image description here

Не удалось загрузить ресурс: сервер ответил со статусом405 ()

** ОБНОВЛЕНО **

Это два метода:

    public async Task<TResponse> PostAsync<TResponse, TRequest>(string requestUri, TRequest request)
    {
        string url = GetUrl(requestUri);
        Console.WriteLine("URI: " + url);
        string json = JsonConvert.SerializeObject(request);
        Console.WriteLine($"{url} | {json}");
        HttpResponseMessage response = await client.PostAsync(url, new StringContent(json));
        return await GetResponseOrThrowHttpException<TResponse>(response);
    }


    private async Task<T> GetResponseOrThrowHttpException<T>(HttpResponseMessage response)
    {
        Console.WriteLine($"GetResponseOrThrowHttpException: {response.StatusCode}");
        string responseString = await response.Content.ReadAsStringAsync();
        Console.WriteLine($"GetResponseOrThrowHttpException ContentStringResult: |{responseString}|");
        if (!response.IsSuccessStatusCode)
        {
            Newtonsoft.Json.Linq.JObject jsonObject = Newtonsoft.Json.Linq.JObject.Parse(responseString);
            string responseStatusString = jsonObject["ResponseStatus"].ToString();

            Console.WriteLine($"GetResponseOrThrowHttpException 4: {responseStatusString}");
            ResponseStatus responseStatus = JsonConvert.DeserializeObject<ResponseStatus>(responseStatusString);
            Console.WriteLine($"Throwing HttpException: {response.StatusCode} {responseStatus.Message}");
            throw new HttpException(response.StatusCode, responseStatus.Message);
        }
        return JsonConvert.DeserializeObject<T>(responseString);
    }

Когда я пытаюсь получить строковое значение ответа,пусто:

string responseString = await response.Content.ReadAsStringAsync();

, а responseString - пустая (длина 0) строка.

Если я выполняю точно такой же запрос в Postman, я получаю действительный ответ:

enter image description here

Итак, ответ JSON, показанный внизу на изображении выше, - это то, с чем я хочу работать в приложении Blazor, и проанализироватьэто как объект JSON и двигаться дальше.Я также отмечаю, что я получаю здесь ошибку 403, которую я ожидал, и в приложении Blazor я получаю 405.

Это проблема CORS, хотя я включил CORS на стороне WS?

Ответы [ 2 ]

3 голосов
/ 14 июня 2019

Полагаю, ваш контент должен быть опубликован так:

new StringContent(json, Encoding.UTF8, "application/json")

Даже если это не причина ваших страданий, лучше использовать это так ...

Надеюсь, это поможет ...

1 голос
/ 14 июня 2019

Убедитесь, что вы настроили правильную конфигурацию CORS для домена. Похоже, вы звонили на другую комбинацию domain:port из своего приложения Blazor. Даже если это C #, все правила безопасности внутри браузера все еще применяются.

...