Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core .net核心web api中未接收到RestRequest正文_Asp.net Core_.net Core_Restsharp - Fatal编程技术网

Asp.net core .net核心web api中未接收到RestRequest正文

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); }

我正在尝试构建一个服务客户端,以简化在.NETCore中调用我的微服务

以下是服务客户端示例:

    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");
}