HttpResponseMessage.Content.ReasAsString返回一个空字符串

时间:2019-06-14 11:42:12

标签: c# httpclient blazor httpresponsemessage

我有一个这样的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));

这是我在PostAsync之前所做的一些Console.Writeline:

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应用程序中使用它)是我想在Blazor应用程序中使用的,并将其解析为JSON对象并从那里继续前进。 我还注意到,我在这里遇到了403错误,这是我所期望的,在Blazor应用中,我得到了405错误。

即使我在WS端启用了CORS,这也是CORS问题吗?

2 个答案:

答案 0 :(得分:3)

我想您的内容应该这样发布:

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

即使这不是造成您痛苦的原因,最好还是这样使用...

希望这对您有帮助...

答案 1 :(得分:1)

验证您是否为域设置了正确的CORS配置。 看来您是从Blazor应用程序中调用了另一个import 'react-native' import renderer from 'react-test-renderer' import { App } from './app' import React from 'react' test('renders correctly', () => { const tree = renderer.create( <App /> ) expect(tree).toBeDefined() }) 组合。即使使用此C#,浏览器内部的所有安全规则仍然适用。