Amb*_*hah 4 c# soap wsdl web-services
我的问题类似于这个:需要在没有wsdl的情况下调用soap ws,除了我的应用程序不使用Spring,所以答案没有帮助.
这就是我所拥有的:
我需要做的是:
我试图从两个不同的角度来看待这个问题,到目前为止还没有运气.我的背景是熟悉使用POST和GET的Web服务,但不熟悉SOAP.在谷歌搜索'C#SOAP'之后,我编写了以下代码:
void soap(String xmlfile)
{
Stream outputStream = null;
StreamReader reader = null;
WebResponse response = null;
try
{
string text = System.IO.File.ReadAllText(xmlfile);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://misapi.ercot.com/2007-08/Nodal/eEDS/EWS");
request.PreAuthenticate = true;
X509Certificate ercotCert = X509Certificate.CreateFromCertFile("D:\\Amigo\\WebSite1\\Nodal_Test_Cert.cer");
request.ClientCertificates.Clear();
request.ClientCertificates.Add(ercotCert);
ServicePointManager.ServerCertificateValidationCallback +=
new System.Net.Security.RemoteCertificateValidationCallback(customValidation);
request.Credentials = CredentialCache.DefaultNetworkCredentials;
// I don't actually have a SOAPAction, but have tried adding a fake one just to see
//request.Headers.Add("SOAPAction", "http://www.ercot.com/Nodal/Payload");
request.Method = "POST";
request.ContentType = "text/xml;charset=\"utf-8\"";
request.ContentLength = text.Length;
StreamWriter writer = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
writer.Write(text);
writer.Close();
response = request.GetResponse();
outputStream = response.GetResponseStream();
reader = new StreamReader(outputStream);
Response.Write(reader.ReadToEnd());
}
catch (WebException e)
{
// This is where it ends up, with Status="ProtocolError"
}
catch (System.Web.Services.Protocols.SoapException soapE)
{
// Never gets in here
}
catch (Exception e)
{
// Never gets in here
}
finally
{
if (outputStream != null)
outputStream.Close();
if(reader != null)
reader.Close();
if(response != null)
response.Close();
}
}
private static bool customValidation(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
return true;
}
Run Code Online (Sandbox Code Playgroud)
这会产生500内部服务器错误.它抛出一个WebException,它不包含其他消息或内部异常,但Status是'ProtocolError'.我尝试过其他排列,包括使用XmlDocument和其他内容类型,但没有一个有效.
我尝试过的另一件事是在Visual Studio中使用"添加Web引用".放入端点URL不起作用,并给出了soap错误.相反,如果我指向我过时的wsdl的本地副本,那么它将添加WebReference但不会让我使用它,因为我无法纠正的大量错误.我的猜测是,这些错误是由于wsdl已过时,如命名空间不匹配或无法在包含的URL中查找内容.如果我用当前的Web服务端点URL替换这些URL,它仍然不起作用.
如果有人能够查明我的代码中的问题,或指导我如何使"添加Web引用"工作,我将不胜感激!
提前致谢!
SOAP只是您向服务POST的有效负载的格式,就是全部.对于字段和命名空间等有一个已定义的规范,并且有不同的SOAP版本,但实际上并没有那么多.(除了它的用法非常冗长,但这是一个不同的主题.)
您需要从当前的WSDL开始.如果您知道自己正在使用WSDL已过时,那意味着Web服务期望(必需)或可以使用(可选)的内容与您的定义不同.WSDL是您进入Web服务的合同网关.您需要获得当前的WSDL.
幸运的是,当我导航到https://misapi.ercot.com/2007-08/Nodal/eEDS/EWS/?WSDL(我通过将"?WSDL"附加到网址的末尾而导出)时,跳过证书错误后,bingo - 服务使用的是WSDL.您可以(a)在本地保存它,或者(b)直接从Visual Studio引用它来构建Web服务客户端.由于cert错误,我建议在本地保存它并从那里构建.
这应该让你开始.
| 归档时间: |
|
| 查看次数: |
6670 次 |
| 最近记录: |