Asp.net core .net核心web api中未接收到RestRequest正文
我正在尝试构建一个服务客户端,以简化在.NETCore中调用我的微服务 以下是服务客户端示例:Asp.net core .net核心web api中未接收到RestRequest正文,asp.net-core,.net-core,restsharp,Asp.net Core,.net Core,Restsharp,我正在尝试构建一个服务客户端,以简化在.NETCore中调用我的微服务 以下是服务客户端示例: public ProductServiceClient(SystemEnvironment.MachineEnvironment? environment = null) { this.url = ServiceEnvironment.Urls.GetUrl(ServiceEnvironment.Service.Product, environment); }
public ProductServiceClient(SystemEnvironment.MachineEnvironment? environment = null)
{
this.url = ServiceEnvironment.Urls.GetUrl(ServiceEnvironment.Service.Product, environment);
}
private RestClient GetClient(string method)
{
return new RestClient(url + "/api/" + method);
}
private RestRequest GetRestRequest(Method method)
{
var restRequest = new RestRequest(method);
restRequest.RequestFormat = DataFormat.Json;
restRequest.AddHeader("Content-Type", "application/json");
return restRequest;
}
public FindProductsResponse FindProducts(FindProductsRequest request)
{
var restRequest = GetRestRequest(Method.GET);
restRequest.AddJsonBody(request);
var client = this.GetClient("Products");
var restResponse = client.Get(restRequest);
return new JsonDeserializer().Deserialize<FindProductsResponse>(restResponse);
}
public void Dispose()
{
}
这可能是你的要求。尸体已经被消耗了。
在打开StreamReader之前,请尝试调用Request.EnableRewind()。这可能是您的请求。正文已被使用。
在打开StreamReader之前,请尝试调用Request.EnableRewind()。我不确定您为什么要手动执行此操作。看起来你正在重新发明轮子。ASP.NET Core已经为您完成了这项工作 您的服务应该是这样的:
[HttpGet] // oops, GET requests will not allow Bodies, this won't work
public ActionResult<FindProductsResponse> Get([FromBody]FindProductsRequest buildRequest)
{
// skip all the serialization stuff, the framework does that for you
var products = _service.FindProducts(buildRequest);
if (products != null && products.Any())
{
return new FindProductsResponse()
{
Products = products
};
}
return BadRequest("Not found");
}
[HttpGet]//oops,GET请求将不允许实体,这将不起作用
公共操作结果获取([FromBody]FindProductsRequest buildRequest)
{
//跳过所有序列化的东西,框架会帮你做到这一点
var products=_service.FindProducts(buildRequest);
if(products!=null&&products.Any())
{
返回新的FindProductsResponse()
{
产品=产品
};
}
返回请求(“未找到”);
}
如果您不想重做所有繁重的工作,即在客户端重新键入所有代码,我建议您阅读swagger(可能采用的形式)。可以生成客户端代码。即使是在VisualStudio中,如果右键单击项目并在上下文菜单中选择“AddRESTAPI客户端…”。请不要错误地手工编写机器可以完美生成的代码。我真的不知道在您的具体案例中出现了什么问题,但搜索可以完全避免的bug只是一项繁忙的工作,这段时间应该花在程序的其他部分上
我刚刚意识到这是一个获取请求。ASP.NET将无法识别GET请求的主体。您需要将其设置为PUT或POST请求,或者将参数设置为查询字符串
如果您碰巧和我一样经常犯这样的错误,您可能需要编写一些单元测试来涵盖这一点。因为.NET在这方面帮不了你 我不知道你为什么要手动操作。看起来你正在重新发明轮子。ASP.NET Core已经为您完成了这项工作 您的服务应该是这样的:
[HttpGet] // oops, GET requests will not allow Bodies, this won't work
public ActionResult<FindProductsResponse> Get([FromBody]FindProductsRequest buildRequest)
{
// skip all the serialization stuff, the framework does that for you
var products = _service.FindProducts(buildRequest);
if (products != null && products.Any())
{
return new FindProductsResponse()
{
Products = products
};
}
return BadRequest("Not found");
}
[HttpGet]//oops,GET请求将不允许实体,这将不起作用
公共操作结果获取([FromBody]FindProductsRequest buildRequest)
{
//跳过所有序列化的东西,框架会帮你做到这一点
var products=_service.FindProducts(buildRequest);
if(products!=null&&products.Any())
{
返回新的FindProductsResponse()
{
产品=产品
};
}
返回请求(“未找到”);
}
如果您不想重做所有繁重的工作,即在客户端重新键入所有代码,我建议您阅读swagger(可能采用的形式)。可以生成客户端代码。即使是在VisualStudio中,如果右键单击项目并在上下文菜单中选择“AddRESTAPI客户端…”。请不要错误地手工编写机器可以完美生成的代码。我真的不知道在您的具体案例中出现了什么问题,但搜索可以完全避免的bug只是一项繁忙的工作,这段时间应该花在程序的其他部分上
我刚刚意识到这是一个获取请求。ASP.NET将无法识别GET请求的主体。您需要将其设置为PUT或POST请求,或者将参数设置为查询字符串
如果您碰巧和我一样经常犯这样的错误,您可能需要编写一些单元测试来涵盖这一点。因为.NET在这方面帮不了你 没有改变任何事情:-(我真的很困惑,因为它是通过postman工作的。你是如何注意到错误的?一个单元测试?一个调用api的控制台应用程序?单元测试-我运行另一个项目的一个spike,它使用我构建的服务客户端调用api。这是因为RestSharp无法将主体附加到GET请求,而postman无法o?我试着从postman那里复制代码(显然,它可以生成C#RestSharp代码,这非常简洁)并将其直接粘贴到我的客户端。相同的标题,相同的所有内容,但仍然没有正文。我开始将其改为POST操作,但在这种情况下GET将是最佳的。当然,这是非常基本的。在您的代码中编辑我的原始POST您使用方法GET创建rest请求并尝试附加它是一个主体。在GET请求中,您不能添加主体。甚至不能从Postman!如果您需要传递主体,则不能使用GET方法,而是POST或PUT。如果您想要GET,则应在查询字符串中传递参数。未更改任何内容:-(我真的很困惑,因为它是通过postman工作的。你是如何注意到错误的?一个单元测试?一个调用api的控制台应用程序?单元测试-我运行另一个项目的一个spike,它使用我构建的服务客户端调用api。这是因为RestSharp无法将主体附加到GET请求,而postman无法o?我试着从postman那里复制代码(显然,它可以生成C#RestSharp代码,这非常简洁)并将其直接粘贴到我的客户端。相同的标题,相同的所有内容,但仍然没有正文。我开始将其改为POST操作,但在这种情况下GET将是最佳的。当然,这是非常基本的。在您的代码中编辑我的原始POST您使用方法GET创建rest请求并尝试附加它是一个主体。在GET请求中,您不能添加主体。甚至不能从Postman!如果您需要传递主体,您不能使用GET方法,而是POST或PUT。如果您想要GET,您应该在查询字符串中传递参数。
[HttpGet] // oops, GET requests will not allow Bodies, this won't work
public ActionResult<FindProductsResponse> Get([FromBody]FindProductsRequest buildRequest)
{
// skip all the serialization stuff, the framework does that for you
var products = _service.FindProducts(buildRequest);
if (products != null && products.Any())
{
return new FindProductsResponse()
{
Products = products
};
}
return BadRequest("Not found");
}