使用C#对WebApi进行身份验证

时间:2018-07-10 19:19:58

标签: c# asp.net-web-api token

我正在使用以下代码调用网络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

1 个答案:

答案 0 :(得分:2)

好吧

'500 - Internal Server Error'

这意味着“服务器收到您的请求,开始处理它,然后发生了意外的事情,以至于它在没有提供任何有用信息的情况下被阻塞并死亡”。

通常,这意味着服务器端存在一个严重的问题,与您无关,也无法控制。举例来说,他们的数据库磁盘空间不足。您对此无能为力。

或者,您的消息可能与服务器期望的消息相去甚远,以至于完全弄糊涂了。也许它期望一些联系信息,而不是二进制文件流。可能是因为期望使用base64编码,而您正在发送二进制文件。也许是预期的ISO日期格式,而您正在发送MM-dd-yyyy-所有猜测,但是500错误无法告诉您任何信息。

通常,如果您的请求有问题,则会出现400样式错误,并显示一条消息,提示错误之处。

无论哪种方式,最快的方法是与拥有服务器的人员联系,向他们发送您的消息,响应和请求的时间戳,并询问他们正在发生什么。服务器上的日志中可能有内容。可能他们会看您的请求,然后说“不,以其他方式格式化”

如果您不能这样做,请尝试在网络上查找更多示例请求,并逐字发送。

TLS vs SSL3几乎无关紧要。

TLS1.2调用到达服务器代码(并使其混淆)。这是好结果。

SSL3调用在到达任何应用程序代码之前已被Web服务器丢弃。这可能是因为服务器管理员已说“不要执行SSL3”,因为不再将SSL3视为安全协议。不要使用它。 (TBH,这也是一个好结果,没人愿意进行不安全的集成。)