Minimal API发送JSON对象的Get请求失败,返回MethodNotAllowed
解决RestSharp调用Minimal API返回MethodNotAllowed的问题
我用PostMan生成的RestSharp代码调用自己的Minimal API,PostMan直接发送请求能得到预期结果,但执行代码时返回“MethodNotAllowed”。相关代码如下:
客户端代码
var options = new RestClientOptions { MaxTimeout = -1, }; var client = new RestClient(options); var request = new RestRequest("https://api.votingcrowd.co.za/User/Details", Method.Get); request.AddHeader("Content-Type", "application/json"); var body = "...."; request.AddStringBody(body, DataFormat.Json); RestResponse response = await client.ExecuteAsync(request); Console.WriteLine(response.Content);
API端代码
app.MapGet(RESTRoutes.UserDetails, ([FromBody] Credentials CredentialObject) => VoteAPI.User.GetUsers(CredentialObject));
问题原因
- HTTP规范冲突:GET请求的设计初衷是获取资源,通常不携带请求体,ASP.NET Core Minimal API对GET请求绑定
[FromBody]参数的支持有限,会直接拒绝这类请求。 - 请求格式不兼容:RestSharp发送带JSON请求体的GET请求,这种不符合常规规范的请求会被服务器判定为无效,返回405 Method Not Allowed。
解决方案
方案一:改用POST请求(推荐)
传递结构化参数时,POST请求更符合REST规范,也能完美适配请求体参数绑定。
修改API端代码
将MapGet替换为MapPost,保留[FromBody]参数绑定:
app.MapPost(RESTRoutes.UserDetails, ([FromBody] Credentials CredentialObject) => VoteAPI.User.GetUsers(CredentialObject));
修改客户端代码
将请求方法改为Method.Post,其余逻辑不变:
var options = new RestClientOptions { MaxTimeout = -1, }; var client = new RestClient(options); var request = new RestRequest("https://api.votingcrowd.co.za/User/Details", Method.Post); request.AddHeader("Content-Type", "application/json"); var body = "...."; request.AddStringBody(body, DataFormat.Json); RestResponse response = await client.ExecuteAsync(request); Console.WriteLine(response.Content);
方案二:改用GET请求传递Query参数(仅适用于简单参数)
如果必须使用GET请求,需将参数放到URL的QueryString中,而非请求体。
修改API端代码
移除[FromBody],改用[FromQuery]绑定参数:
app.MapGet(RESTRoutes.UserDetails, ([FromQuery] Credentials CredentialObject) => VoteAPI.User.GetUsers(CredentialObject));
修改客户端代码
删除请求体相关代码,改用AddQueryParameter添加参数:
var options = new RestClientOptions { MaxTimeout = -1, }; var client = new RestClient(options); var request = new RestRequest("https://api.votingcrowd.co.za/User/Details", Method.Get); // 替换为你的实际参数键值对 request.AddQueryParameter("Username", "your_username"); request.AddQueryParameter("Password", "your_password"); RestResponse response = await client.ExecuteAsync(request); Console.WriteLine(response.Content);
内容的提问来源于stack exchange,提问作者Systellence
相关产品推荐
相关产品推荐

