我正在使用以下代码调用网络api-
public HttpWebRequest CreateSOAPWebRequest()
{
//Making Web Request
HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(@"web api url here");
Req.Proxy = apiWebProxy;
//SOAPAction
Req.Headers.Add(@"SOAPAction:api url here");
//Content_type
Req.ContentType = "text/xml;charset=\"utf-8\"";
Req.Accept = "text/xml";
//HTTP method
Req.Method = "POST";
//return HttpWebRequest
return Req;
}
public void InvokeService(FileRequest fileRequest)
{
//Calling CreateSOAPWebRequest method
HttpWebRequest request = CreateSOAPWebRequest();
XmlDocument SOAPReqBody = new XmlDocument();
//SOAP Body Request
SOAPReqBody.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
<soap:Body>
<Create xmlns=""web api url here"">
<fileRequest>" + fileRequest+ @"</fileRequest>
</Create>
</soap:Body>
</soap:Envelope>");
using (Stream stream = request.GetRequestStream())
{
SOAPReqBody.Save(stream);
}
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
//Geting response from request
using (WebResponse response = request.GetResponse())
{
using (StreamReader rd = new StreamReader(response.GetResponseStream()))
{
//reading stream
var ServiceResult = rd.ReadToEnd();
//writting stream result on console
Console.WriteLine(ServiceResult);
Console.ReadLine();
}
}
}
我的代码失败,并在第using (WebResponse response = request.GetResponse())
行给出了异常
如果我使用ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
我会得到
“ 500-内部服务器错误”
当我使用ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
时,会收到此异常消息
“基础连接已关闭:发生意外错误 发送。验证失败,因为远程方已关闭 传输流。”
远程方提供了令牌,该令牌必须在我的请求对象中传递。因此,fileRequest
对象还包含令牌的值。
我无法理解为与Web api建立连接以及如何使我的代码正常运行所缺少的内容。请提出建议!
TIA
答案 0 :(得分:2)
好吧
'500 - Internal Server Error'
这意味着“服务器收到您的请求,开始处理它,然后发生了意外的事情,以至于它在没有提供任何有用信息的情况下被阻塞并死亡”。
通常,这意味着服务器端存在一个严重的问题,与您无关,也无法控制。举例来说,他们的数据库磁盘空间不足。您对此无能为力。
或者,您的消息可能与服务器期望的消息相去甚远,以至于完全弄糊涂了。也许它期望一些联系信息,而不是二进制文件流。可能是因为期望使用base64编码,而您正在发送二进制文件。也许是预期的ISO日期格式,而您正在发送MM-dd-yyyy-所有猜测,但是500
错误无法告诉您任何信息。
通常,如果您的请求有问题,则会出现400
样式错误,并显示一条消息,提示错误之处。
无论哪种方式,最快的方法是与拥有服务器的人员联系,向他们发送您的消息,响应和请求的时间戳,并询问他们正在发生什么。服务器上的日志中可能有内容。可能他们会看您的请求,然后说“不,以其他方式格式化”
如果您不能这样做,请尝试在网络上查找更多示例请求,并逐字发送。
TLS vs SSL3几乎无关紧要。
TLS1.2调用到达服务器代码(并使其混淆)。这是好结果。
SSL3调用在到达任何应用程序代码之前已被Web服务器丢弃。这可能是因为服务器管理员已说“不要执行SSL3”,因为不再将SSL3视为安全协议。不要使用它。 (TBH,这也是一个好结果,没人愿意进行不安全的集成。)