HttpResponseMessage.Content.ReasAsString returns 一个空字符串
HttpResponseMessage.Content.ReasAsString returns an empty string
我有一个 WS,我这样称呼它:
HttpResponseMessage response = await client.PostAsync(url, new StringContent(json));
WS 将抛出一个异常(禁止),在我调用 PostAsync 的 Blazor 应用程序中,我将得到一个 HttpResponseMessage
,响应代码为 405,不知道为什么是 405,它应该是 403(邮递员 returns 403).
我启用了 CORS(ServiceStack 代码):
Plugins.Add(new CorsFeature(allowedOrigins: "*",
allowedMethods: "GET, POST, PUT, DELETE, OPTIONS",
allowedHeaders: "*",
allowCredentials: true));
这是我做的一些 Console.Writeline,就在 PostAsync 之前:
Failed to load resource: the server responded with a status of 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 中 运行 完全相同的请求,我会得到一个有效的响应:
因此,在上图中底部看到的响应 JSON 是我想在 Blazor 应用程序中使用的内容,并将其解析为 JSON 对象并继续从那里。
我还注意到,我在此处收到了 403 错误,这是我预期的,而在 Blazor 应用程序中,我收到了 405。
即使我在 WS 端启用了 CORS,这是否是 CORS 问题?
验证您是否为域设置了正确的 CORS 配置。
看起来你从 Blazor 应用程序调用了另一个 domain:port
组合。即使这个 C#,浏览器中的所有安全规则仍然适用。
我想你的内容应该这样发布:
new StringContent(json, Encoding.UTF8, "application/json")
即使这不是你痛苦的原因,最好还是用这个,所以...
希望这对您有所帮助...
我有一个 WS,我这样称呼它:
HttpResponseMessage response = await client.PostAsync(url, new StringContent(json));
WS 将抛出一个异常(禁止),在我调用 PostAsync 的 Blazor 应用程序中,我将得到一个 HttpResponseMessage
,响应代码为 405,不知道为什么是 405,它应该是 403(邮递员 returns 403).
我启用了 CORS(ServiceStack 代码):
Plugins.Add(new CorsFeature(allowedOrigins: "*",
allowedMethods: "GET, POST, PUT, DELETE, OPTIONS",
allowedHeaders: "*",
allowCredentials: true));
这是我做的一些 Console.Writeline,就在 PostAsync 之前:
Failed to load resource: the server responded with a status of 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 中 运行 完全相同的请求,我会得到一个有效的响应:
因此,在上图中底部看到的响应 JSON 是我想在 Blazor 应用程序中使用的内容,并将其解析为 JSON 对象并继续从那里。 我还注意到,我在此处收到了 403 错误,这是我预期的,而在 Blazor 应用程序中,我收到了 405。
即使我在 WS 端启用了 CORS,这是否是 CORS 问题?
验证您是否为域设置了正确的 CORS 配置。
看起来你从 Blazor 应用程序调用了另一个 domain:port
组合。即使这个 C#,浏览器中的所有安全规则仍然适用。
我想你的内容应该这样发布:
new StringContent(json, Encoding.UTF8, "application/json")
即使这不是你痛苦的原因,最好还是用这个,所以...
希望这对您有所帮助...