我有一个客户服务。在该服务中,我有以下方法:
public async Task<IEnumerable<Client>> ReadAsync()
{
using (var conn = new SqlConnection(_connString))
using (var cmdRead = new SqlCommand("SELECT * FROM Client", conn))
{
conn.Open();
var ret = new List<Client>();
var reader = await cmdRead.ExecuteReaderAsync();
while (reader.Read())
{
var client = BuildFromDataReader(reader);
ret.Add(client);
}
return ret;
}
}
此方法由 Web API 控制器操作调用,如下所示:
[HttpGet]
public async Task<IEnumerable<Client>> Get()
{
// API side.
IEnumerable<Client> clients = await _clients.ReadAsync();
return clients;
}
我希望内容协商的默认值是 JSON,因此希望此操作返回 JSON 编码Client
列表。
我尝试使用 Web API 的所有这些客户端看起来更像这样:
public async Task<IEnumerable<Client>> ReadAsync()
{
var json = await Client.GetStringAsync("api/Clients/Get");
var clients = JsonConvert.DeserializeObject<IEnumerable<Client>>(json);
return clients;
}
在断点处检查时,json
的值"value"
(包括引号)。我试过什么?上面的代码。我期望 Web API 操作返回的 json 在哪里?
PS:我正忙于一个 ASP.NET 核心项目,所以我们也在使用NewtonSoft JSON。
我认为反对票是由于您在没有验证您的事实的情况下表达了假设。
一个简单的三步谷歌搜索导致 https://learn.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/content-negotiation 详细说明webapi用于内容协商的标准。
从中可以看出,您的假设是不正确的 - 假设并不总是不连贯的吗?
仅当请求声明它将接受的内容时,才会返回 Json。因此,您需要在请求上设置接受标头以接受 Json。引用文章:
GET http://localhost.:21069/api/products/1 HTTP/1.1
Host: localhost.:21069
Accept: application/json, text/javascript, */*; q=0.01
这似乎是一个非常不可能的失败点,但我在研究HttpClient
和这个问题时遇到过很多很多次。
看起来 BaseAddress
字符串属性必须以尾随的"/"结尾。我不知道我是否无意中改变了其他内容,但是一旦我添加了尾部斜杠,我就重新开始营业了。例如,端口号后面的斜杠:
private static readonly HttpClient Client = new HttpClient {BaseAddress = new Uri("http://localhost:63675/") };