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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.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
C# 如何在asp.net core中使用RestSharp.NetCore_C#_Asp.net Core_Asp.net Core Mvc_Restsharp - Fatal编程技术网

C# 如何在asp.net core中使用RestSharp.NetCore

C# 如何在asp.net core中使用RestSharp.NetCore,c#,asp.net-core,asp.net-core-mvc,restsharp,C#,Asp.net Core,Asp.net Core Mvc,Restsharp,我已经通过了代码,这是伟大的工作。下面是没有asp.net内核的RestSharp的代码 public GenericResponseObject<T> GetGeneric<T>(string operation, params KeyValuePair<string, string>[] nameValues) where T : class { RestClient client = new RestClient(_baseUrl) {

我已经通过了代码,这是伟大的工作。下面是没有asp.net内核的RestSharp的代码

public GenericResponseObject<T> GetGeneric<T>(string operation, params KeyValuePair<string, string>[] nameValues) where T : class
{
    RestClient client = new RestClient(_baseUrl)
    {
        Authenticator = new HttpBasicAuthenticator(_username, _password)
    };

    RestRequest request = new RestRequest(operation, Method.GET);

    foreach (KeyValuePair<string, string> nameValue in nameValues)
    {
        request.AddQueryParameter(nameValue.Key, nameValue.Value);
    }

    IRestResponse<GenericResponseObject<T>> response = client.Execute<GenericResponseObject<T>>(request);
        GenericResponseObject<T> responseObject = response.Data;
        return responseObject;
    }
}
public-GenericResponseObject GetGeneric(字符串操作,参数KeyValuePair[]nameValues),其中T:class
{
RestClient=newrestclient(\u baseUrl)
{
Authenticator=新的HttpBasicAuthenticator(\u用户名,\u密码)
};
RestRequest请求=新的RestRequest(操作,方法.GET);
foreach(nameValues中的KeyValuePair nameValue)
{
request.AddQueryParameter(nameValue.Key,nameValue.Value);
}
IRestResponse response=client.Execute(请求);
GenericResponseObject responseObject=response.Data;
返回响应对象;
}
}
这个代码对我来说非常有用。现在我想在asp.net核心中实现相同的代码


我可以得到一个如何在asp.net内核中使用RestSharp的示例吗。我已经添加了依赖项RestSharp.NetCore”:105.2.3

存在一个堆栈溢出问题和示例,在RestSharp.NetCore上调用ExecuteAsync

using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using RestSharp;

public async Task<SomeObject> TestPost(ObjectFoo foo)
{
    JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings { 
    ContractResolver = new CamelCasePropertyNamesContractResolver() 
    };

    RestClient restClient = new RestClient(API_URL);

    RestRequest request = new RestRequest("SOME_METHOD", Method.POST);
    request.AddHeader("Accept", "application/json");

    string jsonObject = JsonConvert.SerializeObject(foo, Formatting.Indented, jsonSerializerSettings);
    request.AddParameter("application/json", jsonObject, ParameterType.RequestBody);

    TaskCompletionSource<IRestResponse> taskCompletion = new TaskCompletionSource<IRestResponse>();

    RestRequestAsyncHandle handle = restClient.ExecuteAsync(
        request, r => taskCompletion.SetResult(r));

    RestResponse response = (RestResponse)(await taskCompletion.Task);

    return JsonConvert.DeserializeObject<SomeObject>(response.Content);
}

我在引用Newtonsoft.Json 9.0.2-beta2时成功地使用了该示例

using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using RestSharp;

public async Task<SomeObject> TestPost(ObjectFoo foo)
{
    JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings { 
    ContractResolver = new CamelCasePropertyNamesContractResolver() 
    };

    RestClient restClient = new RestClient(API_URL);

    RestRequest request = new RestRequest("SOME_METHOD", Method.POST);
    request.AddHeader("Accept", "application/json");

    string jsonObject = JsonConvert.SerializeObject(foo, Formatting.Indented, jsonSerializerSettings);
    request.AddParameter("application/json", jsonObject, ParameterType.RequestBody);

    TaskCompletionSource<IRestResponse> taskCompletion = new TaskCompletionSource<IRestResponse>();

    RestRequestAsyncHandle handle = restClient.ExecuteAsync(
        request, r => taskCompletion.SetResult(r));

    RestResponse response = (RestResponse)(await taskCompletion.Task);

    return JsonConvert.DeserializeObject<SomeObject>(response.Content);
}
使用System.Threading.Tasks;
使用Newtonsoft.Json;
使用Newtonsoft.Json.Serialization;
使用RestSharp;
公共异步任务TestPost(ObjectFoo-foo)
{
JsonSerializerSettings JsonSerializerSettings=新JsonSerializerSettings{
ContractResolver=新的CamelCasePropertyNamesContractResolver()
};
RestClient RestClient=新的RestClient(API_URL);
RestRequest请求=新的RestRequest(“某些方法”,METHOD.POST);
AddHeader(“接受”、“应用程序/json”);
字符串jsonObject=JsonConvert.SerializeObject(foo,Formatting.Indented,jsonSerializerSettings);
AddParameter(“application/json”,jsonObject,ParameterType.RequestBody);
TaskCompletionSource taskCompletion=新建TaskCompletionSource();
RestRequestAsynchHandle=restClient.ExecuteAsync(
请求,r=>taskCompletion.SetResult(r));
RestResponse response=(RestResponse)(等待taskCompletion.Task);
返回JsonConvert.DeserializeObject(response.Content);
}

更新:我仍然看到这方面的投票结果。请按照Alexey Zimarev的答案。这个答案是针对非开源的
RestSharp.NetCore
nuget包的,当时官方的RestSharp包没有针对.NET标准。


除了Antwone Antics的答案之外,创建一个扩展类:

public static class RestClientExtensions
{
    public static async Task<RestResponse> ExecuteAsync(this RestClient client, RestRequest request)
    {
        TaskCompletionSource<IRestResponse> taskCompletion = new TaskCompletionSource<IRestResponse>();
        _ = client.ExecuteAsync(request, r => taskCompletion.SetResult(r));
        return (RestResponse)(await taskCompletion.Task);
    }
}

您还可以创建扩展方法来解析响应以返回强类型,依此类推。

RestSharp v106支持.NET标准,因此您的代码应该可以在不做任何更改的情况下工作


RestSharp.NetCore
软件包不是由RestSharp团队提供的,我们也不支持它。它也没有更新,所有者也没有回复消息,软件包的源代码也没有发布。

我从中创建了一个扩展方法(上下文见上面的注释)

公共静态类扩展
{
公共静态重新响应执行(此IRestClient客户端,IRestRequest请求)
{
var taskCompletion=new TaskCompletionSource();
ExecuteAsync(请求,r=>taskCompletion.SetResult(r));
返回(重新响应)(taskCompletion.Task.Result);
}
}

现在我可以使用它作为
var response=restClient.Execute(request);

请发布一个答案,以及要遵循的步骤。然后referenceI将其进一步扩展,并为其创建了一个扩展方法。(见下文)。这是胡说八道。gldraphael答案的副本已损坏。我说“复制”是因为它确实如此,并且“已损坏”,因为它会删除Task/async模式,并通过
.Result
隐式等待。在我的例子中,我想要一个同步版本,因此我实际上会阻塞,直到得到结果。如果我想要异步版本,那么我只需要使用框架中内置的ExecuteAsync()方法。我想你误解了我的用例。你能详细说明一下“损坏”吗?如果我说的是错的,那么我想修正它,这样它可以帮助其他人。当然。对我来说,隐式等待任务是一个bug。首先,它应该显式地
.Wait
,以便进一步的维护人员在重构/etc期间很容易注意到这一点。但更重要的是,在
接口IRestClient
中,从最新的
.nuget\packages\restsharp\106.2.1\lib\netstandard2.0\restsharp.dll可以看出:(A)
ExecuteAsync(请求、回调)
通过回调,您可以通过
TaskCompletionSource
进入同步方式,(B)
executetasksasync(IRestRequest请求)只需
.Result
.Wait
,您就可以将其破解为同步,最后您就可以(C)同步
执行(请求)
-转到figure.client.ExecuteAsync只接受一个argument@PieroAlberto对这就是为什么您需要上面的扩展方法:)小说明:
RestRequestAsyncHandle句柄
未使用,因此可以保留在示例之外。我有dotnetcore web api,希望使用restsharp调用我的其他web服务,但找不到任何示例。还是辅导?希望您添加链接或示例。请原谅,我真的想知道为什么RestSharp.NetCore SDK很烂。。。现在有道理了。我无法安装RestSharp.Netcore nuget包。我刚回到RestSharp。希望这能给别人省去一些麻烦。
public static class RestSharpExtensions
{
    public static RestResponse Execute(this IRestClient client, IRestRequest request)
    {
        var taskCompletion = new TaskCompletionSource<IRestResponse>();
        client.ExecuteAsync(request, r => taskCompletion.SetResult(r));
        return (RestResponse)(taskCompletion.Task.Result);
    }
}