我一直在HttpClient使用C#进行WebApi调用.似乎比较简洁快捷WebClient.但是我在Https打电话时被困住了.
如何制作以下代码才能Https拨打电话?
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://foobar.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/xml"));
var task = httpClient.PostAsXmlAsync<DeviceRequest>(
"api/SaveData", request);
Run Code Online (Sandbox Code Playgroud)
编辑1: 上面的代码适用于进行http调用.但是,当我将方案更改为https时,它不起作用.这是获得的错误:
底层连接已关闭:无法为SSL/TLS安全通道建立信任关系.
编辑2: 将方案更改为https是:第一步.
如何提供证书和公钥/私钥以及C#请求.
我正在开发一个需要连接到https站点的项目.每次连接时,我的代码都会抛出异常,因为该站点的证书来自不受信任的站点.有没有办法绕过证书检查.net核心http?
我在以前版本的.NET中看到了这段代码.我想我只需要这样的东西.
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用自签名证书建立与测试服务器的 SSL/TLS连接.通过不安全的渠道进行沟通没有问题.
这是我的示例代码,我是基于这个解决方案编写的: 使用HttpClient C 允许不受信任的SSL证书#忽略证书错误?.NET客户端连接到ssl Web API
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
var c = new HttpClient();
var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result;
if (r.IsSuccessStatusCode)
{
Log.AddMessage(r.Content.Get<string>());
}
else
{
Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase));
}
Run Code Online (Sandbox Code Playgroud)
还试过这个:
var handler = new WebRequestHandler();
handler.ServerCertificateValidationCallback = delegate { return true; };
var c = new HttpClient(handler);
...
Run Code Online (Sandbox Code Playgroud)
还有这个
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
Run Code Online (Sandbox Code Playgroud)
但每次我都有例外:
InnerException: System.Net.Http.HttpRequestException
_HResult=-2146233088
_message=An error occurred while sending the request. …Run Code Online (Sandbox Code Playgroud) 有没有办法做这里描述的事情:https://stackoverflow.com/a/2675183但在Xamarin.Forms PCL应用程序?我正在使用HttpClient连接到服务器.
我有一个ASP.NET Web API,我想与ssl一起使用.目前,服务器正在使用自签名证书,此时允许使用http和https.我有一个非常基本的测试客户端,它适用于http,但不适用于https.我想知道如何修改下面的客户端代码,以便它可以与https一起使用.目前IE,Firefox和Chrome都可以使用http和https(带有证书警告)连接到Web API,因此这让我相信我不应该只修改服务器上的任何内容,只需在客户端代码中.这是客户端代码:
static void Main(string[] args)
{
try
{
if (args.Length != 1)
{
Console.WriteLine("Please provide a url, and only a url.");
return;
}
var url = new Uri(args[0]);
var urlAuthority = url.GetLeftPart(UriPartial.Authority);
var urlPathQuery = args[0].Substring(urlAuthority.Length);
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(urlAuthority);
HttpResponseMessage response = client.GetAsync(urlPathQuery).Result;
if (response.IsSuccessStatusCode)
Console.WriteLine(response.Content.ReadAsAsync<string>().Result); // expecting scalar results only
else
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
catch (Exception ex)
{
Exception tempEx = ex;
while (tempEx != null)
{
Console.WriteLine(tempEx.Message); …Run Code Online (Sandbox Code Playgroud) 我正在编写 ASP.Net MVC Core 2.2 Web App。我需要使用 HTTP 或 HTTPS 从另一个 Web 服务器获取数据。我该怎么做?
我使用HttpClient.
我有一个接收消息的控制器,它工作正常,但是,我应该构建HttpClient吗?
[Route("api/[controller]")]
[ApiController]
public class MyController : ControllerBase
{
private readonly IHostingEnvironment _env;
private readonly ILogger _logger;
private readonly IUpdateService _updateService;
public MyController(
IHostingEnvironment env,
ILogger<MyController> logger,
IUpdateService updateService)
{
_env = env;
_logger = logger;
_updateService = updateService;
}
// POST api/values
[HttpPost]
public async Task<IAsyncResult> Post([FromBody]Update update)
{
using (HttpClient Client = new HttpClient())
{
HttpResponseMessage result = Client.GetAsync(uri).Result;
switch …Run Code Online (Sandbox Code Playgroud) 在 Visual Studio 中进行本地开发和身份验证时,我始终收到以下错误:
AuthenticationException:由于证书链中的错误,远程证书无效:NotValidTime、UntrustedRoot
其中,当使用从我们的项目之一HttpClient调用我们的后端端点之一( )时会发生这种情况,因此这一切都发生在本地。localhost
该证书从去年的这个日期开始签署/有效,一年后现已失效。我团队中的其他开发人员都没有收到它或遇到相同的问题。
然后我尝试了很多东西,其中包括:
dotnet dev-certs https --clean、dotnet dev-certs https和dotnet dev-certs https --trust,它成功更新/重新创建了 2023 年到期的证书 - 但仍然不起作用/仍然收到相同的错误。我们没有集中的身份验证程序 - 它分布在系统的各个地方和场景中,因此我无法使用像if #DEBUG... //then ignore certificates. 我需要正确生成有效的证书。
无法通过证书验证解决问题.
有Web API服务器,它使用HTTPS来处理请求.服务器的证书具有以下认证路径:RCA(root) - > ICA(中间) - > Web API服务器.RCA,ICA和Web API服务器是同一Active Directory域的成员.
客户端应用程序(桌面,计算机加入同一域)用于HttpClient与服务器通信并支持两种方案:
两种方案都使用基本身份验
RCA和ICA证书分别放在"受信任的根证书颁发机构"和"中间证书颁发机构"中,用于本地计算机帐户.RCA证书是自签名的.
现在,当客户端连接到公司网络时,证书验证按预期工作,用户可以与Web API"对话".
当客户端断开连接(只有Internet连接可用)时,证书验证失败AuthenticationException("远程证书根据验证过程无效").
我不想完全关闭证书验证,但只需要告诉验证系统,这个特定证书是有效的.此外,客户端应用程序使用SignalR,它默认使用它自己的传输.因此,这和这不是选项.
为什么将RCA ICA证书放到"Trusted ..."和"Intermediate ..."文件夹中没有帮助?
有没有解决方法?
我试图将代码从控制台应用程序转移到uwp,在这个使用ServicePointManager的控制台应用程序中使用所有证书,在uwp应用程序中我不使用它们并且文本有异常 - "无法建立与服务器的连接".
问题是 - 如何替换ServicePointManager并在uwp中应用所有证书(因为我不知道该服务器使用的证书类型).
CodePointManager代码如下:
ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback
(bypassAllCertificateStuff);
private static bool bypassAllCertificateStuff(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
return true;
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的答复!
我正在尝试通过自签名证书发出失败的Web请求:
Client = new HttpClient();
HttpResponseMessage Response = await Client.GetAsync(Uri)//defined elsewhere
Run Code Online (Sandbox Code Playgroud)
这会引发信任失败异常.
我httpclienthandler按照这里的建议再次尝试使用HttpClient允许不受信任的SSL证书:
var handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback =
(
HttpRequestMessage message,
X509Certificate2 cert,
X509Chain chain,
SslPolicyErrors errors
) =>{return true; };//remove if this makes it to production
Client = new HttpClient(handler);
Run Code Online (Sandbox Code Playgroud)
这会引发一个未实现异常的系统.
有没有其他方法可以信任自签名证书?我甚至在机器上安装了证书,但没有运气.
我正在创建一个API,充当应用程序和其他2个API之间的桥梁。我想知道最好的方法是什么。我正在使用HttpClient。该应用程序有近一千个用户。
我阅读了这篇文章https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/。我真的不应该使用using语句吗?我也在做同步api调用。这有什么作用吗?我做的效率高吗?
这是我的代码:
[HttpGet]
[Route("api/apiname")]
public String GetNumberofP([FromUri]GetNumberofPRequest getNPRequest){
var request = JsonConvert.SerializeObject(getNPRequest);
string errorMessage = "";
try{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.gettoken());
var response = httpClient.GetAsync("api/MobileApp/GetNumberP?"
+ "strCardNumber=" + getNPRequest.strCardNumber
+ "&strDateOfBirth=" + getNPRequest.strDateOfBirth).Result;
return response;
}
catch (Exception e){
throw utils.ReturnException("GetNumberofP", e, errorMessage);
}
}
Run Code Online (Sandbox Code Playgroud)