C# 证书无效或错误导致POST请求失败
我试图在一个UWP C#应用程序中基于的POST请求。 我的示例代码是:C# 证书无效或错误导致POST请求失败,c#,exception,uwp,certificate,C#,Exception,Uwp,Certificate,我试图在一个UWP C#应用程序中基于的POST请求。 我的示例代码是: string scriptname = "myscript.php"; var content = new FormUrlEncodedContent(values); //Exception Line (103): var response = await client.PostAsync("https://myserver.ddns.net/" + scriptname, content); var responseS
string scriptname = "myscript.php";
var content = new FormUrlEncodedContent(values);
//Exception Line (103):
var response = await client.PostAsync("https://myserver.ddns.net/" + scriptname, content);
var responseString = await response.Content.ReadAsStringAsync();
string SJson = responseString.ToString();
messagedialog.Content = SJson;
异常日志:
System.Net.Http.HttpRequestExceptionHResult=0x80072F0D
Message=发送请求时出错。
Source=System.Net.Http
堆栈跟踪: 在System.Net.Http.HttpClientHandler.d_u86.MoveNext()上 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中 在System.Net.Http.HttpClient.d_u58.MoveNext()上 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中 在System.Runtime.CompilerServices.TaskWaiter1.GetResult()中 在d:\Onedrive\myproject\myproject\App\App\MainPage.xaml.cs中的Aplikacija_iFE.MainPage.d__10.MoveNext()中:第103行 内部异常1: COMException:找不到与此错误代码关联的文本 我的孩子们在纳帕čččččččččččč
粗体字符串是我的母语,告诉我CA无效或错误(基本上是,因为我自己签名)。是否可以使用某些C#代码暂时修复此错误,或者我必须替换证书? 我的HTTPS(Apache)服务器位于Debian 9机器上。
编辑(晚上10:20):工作代码
下面的代码目前还可以使用,但是它非常丑陋,非常不安全,对于我这个刚开始编程的学生来说,这只是一个小问题:|
string scriptname = "MyRestAPI.php";
HttpFormUrlEncodedContent content = new HttpFormUrlEncodedContent(values);
HttpResponseMessage response = new HttpResponseMessage();
try
{
client = new HttpClient();
response = await client.PostAsync(new Uri("https://myserver.ddns.net/" + scriptname), content);
}
catch (Exception e)
{
HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter();
ChainValidationResult[] results = new ChainValidationResult []
{
ChainValidationResult.Untrusted, ChainValidationResult.WrongUsage,
ChainValidationResult.BasicConstraintsError, ChainValidationResult.Expired,
ChainValidationResult.IncompleteChain, ChainValidationResult.InvalidCertificateAuthorityPolicy,
ChainValidationResult.InvalidName, ChainValidationResult.OtherErrors,
ChainValidationResult.RevocationFailure, ChainValidationResult.RevocationInformationMissing,
ChainValidationResult.Revoked, ChainValidationResult.UnknownCriticalExtension
};
for(int i=0;i<results.Length;i++)
{
try
{
filter.IgnorableServerCertificateErrors.Add(results[i]);
client = new HttpClient(filter);
response = await client.PostAsync(new Uri("https://myserver.ddns.net/" + scriptname), content);
}
catch
{
continue;
}
}
client = new HttpClient(filter);
response = await client.PostAsync(new Uri("https://myserver.ddns.net/" + scriptname), content);
}
finally
{
client.Dispose();
}
messagedialog.Content = response.Content.ToString();
string scriptname=“MyRestAPI.php”;
HttpFormUrlEncodedContent内容=新的HttpFormUrlEncodedContent(值);
HttpResponseMessage response=新的HttpResponseMessage();
尝试
{
client=新的HttpClient();
response=wait client.PostAsync(新Uri(“https://myserver.ddns.net/“+脚本名),内容);
}
捕获(例外e)
{
HttpBaseProtocolFilter=新的HttpBaseProtocolFilter();
ChainValidationResult[]结果=新的ChainValidationResult[]
{
ChainValidationResult.Untrusted,ChainValidationResult.ErrorUsage,
ChainValidationResult.BasicConstraintError,ChainValidationResult.Expired,
ChainValidationResult.UncompleteChain,ChainValidationResult.InvalidCertificateAuthorityPolicy,
ChainValidationResult.InvalidName、ChainValidationResult.OtherErrors、,
ChainValidationResult.RevocationFailure,ChainValidationResult.RevocationFormationMissing,
ChainValidationResult.Reversed,ChainValidationResult.UnknownCriticalExtension
};
对于(int i=0;i您可以在开发环境中使用配置忽略此错误,或使您的客户端信任证书,即只需将证书添加到您客户端上的受信任根目录中。您上面显示的URL是否准确或是否应该是HTTPS URL?抱歉,URL中应该有HTTPS。感谢link@Dirk,但我认为我的服务器是Debian 9上的Apache服务器。@S4NNY1服务器一点都不重要。您可以使用上面注释中链接的代码忽略客户端中的证书验证错误。我强烈建议您仅在测试时这样做,这是验证证书的原因之一。但在UWP中没有ServicePointManager.ServerCertificateValidationCallback=delegate{return true;};
我可以使用所述的IgnorableServerCertificateErrors,但Windows.Web.Http也会与上面代码的基本功能所需的System.Net.Http发生冲突,因为Windows.Web不包含某些函数/方法。