gpt4 book ai didi

c# - 如何使用 Web Api 实现请求/响应模式?

转载 作者:行者123 更新时间:2023-11-30 16:16:21 24 4
gpt4 key购买 nike

我是 MVC Web Api 的新手,但我有一些使用 ServiceStack 框架的经验。一些 web api 示例看起来很像 RPC,具有更多的操作方法和更少的参数。事实上,大多数示例似乎都将请求参数限制为一个 id。我想使用请求/响应创建一些报告服务,因为请求对于所有报告标准来说变得非常复杂。

这是我简化的请求/响应类型:

public class PendingRequest
{
public string Id { get; set; }
public int AccountId { get; set; }
public DateTime? FromDate { get; set; }
public DateTime? ToDate { get; set; }
}

public class PendingResponse
{
public string Id { get; set; }
public IEnumerable<Pending> Data { get; set; }
}

还有我的大纲报告 Controller :

public class ReportsController : ApiController
{
public async Task<PendingResponse> GetPending(PendingRequest request)
{
return new PendingResponse
{
Id = request.Id,
// Data = await Repo.GetPending()
};
}

public async Task<ShippedResponse> GetShipped(ShippedRequest request)
{
return new ShippedResponse
{
Id = request.Id,
// Data = await Repo.GetShipped()
};
}

public async Task<ProductsResponse> GetProducts(ProductsRequest request)
{
return new ProductsResponse
{
Id = request.Id,
// Data = await Repo.GetProducts()
};
}
}

以及我的自托管应用的路由和配置:

class Program
{
static void Main()
{
var config = new HttpSelfHostConfiguration("http://localhost:8080");

config.Routes.MapHttpRoute(
name: "Reports",
routeTemplate: "api/reports/{action}",
defaults: new
{
controller = "Reports"
});

using (var server = new HttpSelfHostServer(config))
{
server.OpenAsync().Wait();
Console.WriteLine("Press Enter to quit.");
Console.ReadLine();
}
}
}

因此,对于此路由,我打算将操作作为报告的名称。请注意,我没有在此处包含请求参数。不确定我是否应该。

其实问题出在客户端。对于 HttpClient,GetAsync 方法不允许我包含 JSON 请求对象。我看到了一个扩展方法 PostAsJsonAsync 但肯定这不应该是一个 POST?如果没有 GetAsJsonAsync 或类似的,那么我看不到用 GET 包含请求的方法吗?

老实说,我更喜欢 ServiceStack,但似乎还没有异步支持。我需要开发一些 I/O 密集型的高性能服务,我想尽可能减少阻塞。

更新:

如果我不使用请求主体,而是将模型的参数作为查询字符串的一部分,那么 Web Api 似乎将执行模型绑定(bind)。为了使其工作,Get 方法需要在模型类型前加上 [FromUri] 属性,该属性通知模型绑定(bind)器应该从请求查询字符串构造模型。凌乱,但有效。

[ActionName("Pending")]
public async Task<PendingResponse> GetPending([FromUri] PendingRequest request)
{
return new PendingResponse
{
Id = request.Id,
// query = ...build from request params
// Data = await Repo.GetPending(query)
};
}

现在在客户端我执行以下操作:

var result = await _httpClient.GetAsync("api/reports/pending?Id=123&AccountId=456");
result.EnsureSuccessStatusCode();
var response = await result.Content.ReadAsAsync<PendingResponse>();

调用该服务会导致调用 GetPending 方法,并使用根据提供的查询字符串参数具体化的 PendingRequest 对象的副本。

最佳答案

这里的根本问题是您试图向 HTTP GET 提供请求主体,这是不允许的。好吧,您仍然可以继续使用请求正文格式化 GET 并提交它,但这不符合规范。严格来说,HTTP 规范并不禁止 GET 请求拥有主体,但 GET 请求的响应不得根据请求主体而改变,这基本上意味着您不能在 GET 请求主体中使用搜索条件。你可以使用 URI 路径和查询字符串来指定搜索条件,如果你想将它们绑定(bind)到一个复杂的类型参数中,你将需要使用 [FromUri]像这样:public async Task<PendingResponse> GetPending([FromUri]PendingRequest request) .

关于c# - 如何使用 Web Api 实现请求/响应模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18503960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com