我的 WCF Rest 向另一个 Rest API 发出请求,但它返回以下错误:
System.Net.WebException:连接已终止:意外发送 错误。 ---> System.IO.IOException: 身份验证失败,因为 远程方关闭了传输流。 \r\n中 System.Net.Security.SslState.StartReadFrame(Byte[]缓冲区,Int32 readBytes, AsyncProtocolRequest asyncRequest)\r\n 中 System.Net.Security.SslState.StartReceiveBlob(Byte[]缓冲区, AsyncProtocolRequest asyncRequest)\r\n 中 System.Net.Security.SslState.CheckCompletionBeforeNextReceive (ProtocolToken消息,AsyncProtocolRequest asyncRequest)\r\n中 系统。 Net.Security.SslState.StartSendBlob(Byte[]传入,Int32 count, AsyncProtocolRequest asyncRequest) \r\n 中 System.Net.Security.SslState.ForceAuthentication(布尔值 receiveFirst, Byte[] 缓冲区, AsyncProtocolRequest asyncRequest) \ r
n System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)\r\n 中的 System.Net.TlsStream.CallProcessAuthentication (对象状态)\r\n中 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 saveSyncCtx)\r\n 中的 System.Threading.ExecutionContext.Run (ExecutionContext执行上下文,ContextCallback回调,对象 state,布尔值preserveSyncCtx)\r\n中 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback回调、对象状态)\r\n中 System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult 结果)
System.Net.TlsStream.Write中的r\n(Byte[]缓冲区,Int32偏移量, Int32大小)\r\n in System.Net.PooledStream.Write(Byte[]缓冲区, Int32偏移量,Int32大小)\r\n中 System.Net.ConnectStream.WriteHeaders(布尔异步)\r\n --- 结束 内部异常的堆栈跟踪 --- \r\n 中 System.Net.WebClient.UploadDataInternal(Uri地址,String方法, Byte[]数据,WebRequest&请求)\r\n中 System.Net.WebClient.UploadString(Uri地址,字符串方法,字符串 data)\r\n in BS.Control.Save.Send(String body, String to)
我的函数位于一个名为 BS 的 C# 库中,在“Send”类中,我在其中执行以下操作:
那个
json= {"user":"test","pass":"12345","message":"test 1","number":"12345678"}
using (var WC = new WebClient())
{
JObject response = new JObject();
ResponseD Result = new ResponseD();
try
{
WC.Headers.Add(HttpRequestHeader.Authorization,"Bearer MyCode");
WC.Headers.Add(HttpRequestHeader.ContentType,"application/json");
string baseurl = "url-where receive the post";
response = JObject.Parse(WC.UploadString(new Uri(baseurl), "POST", json));
}
catch(Exception ex)
{
Result.id = "Error";
Result.result = ex.ToString();
}
}
此异常存在于我的本地 PC、我的 IIS 服务器中,甚至在 Azure APPservice 中......在我的 IIS 服务器中,我将 SSL 配置为拥有 WCF 的位置,但使用 SSL 后,我的 WCF 仍会出现相同的问题,并且不发送回复...
我正在制作一个控制台应用程序,我使用与我的WCF Rest相同的库,并且在这方面没有问题,
response = JObject.Parse (WC.UploadString (new Uri (baseurl)," POST ", json));
毫无问题地接收答案....收到一个漂亮的JSON,其中包含分配给的id信息请求、发出的时间等,但我唯一需要的是 ID 和来自 ConsoleApp 的一切都运行良好....
响应的Json为:
{
"id": "Error",
"result":
the exception mentioned above and the location in Line where the problem is located and this is where the WC.uploadstring is
}
有人可以帮我解决这个问题吗?
OP 的解决方案。
原来是Rest服务所在的服务器不兼容TLS1.0。
所以我在 uploadstring 之前添加了这段代码,它在我的 IIS 服务器上完美运行。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
| SecurityProtocolType.Tls12
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls;