如何使用旧的WSDL+在C#中进行SOAP调用;XSD和当前Web服务位置?

如何使用旧的WSDL+在C#中进行SOAP调用;XSD和当前Web服务位置?,c#,web-services,soap,wsdl,C#,Web Services,Soap,Wsdl,我的问题与此类似:只是我的应用程序不使用Spring,所以答案没有帮助 以下是我所拥有的: 仅接受SOAP请求的web服务 web服务的当前终结点URL 过时的wsdl和xsd文件 过时的示例SOAP请求文件 我需要做的是: 使用上面的一些组合成功地发出SOAP请求 我试着从两个不同的角度来处理这个问题,但到目前为止运气都不好。我的背景是熟悉使用POST和GET的web服务,但不熟悉SOAP。在谷歌搜索“C#SOAP”之后,我编写了以下代码: void soap(String x

我的问题与此类似:只是我的应用程序不使用Spring,所以答案没有帮助

以下是我所拥有的:

  • 仅接受SOAP请求的web服务
  • web服务的当前终结点URL
  • 过时的wsdl和xsd文件
  • 过时的示例SOAP请求文件
我需要做的是:

  • 使用上面的一些组合成功地发出SOAP请求
我试着从两个不同的角度来处理这个问题,但到目前为止运气都不好。我的背景是熟悉使用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;
}
这将产生500个内部服务器错误。它抛出一个WebException,其中不包含任何其他消息或内部异常,但状态为“ProtocolError”。我尝试过其他的排列方式,包括使用XmlDocument和其他内容类型,但都没有成功

我尝试过的另一件事是在VisualStudio中使用“添加Web引用”。输入端点URL无效,并导致soap错误。相反,如果我指向过时的wsdl的本地副本,那么它将添加WebReference,但由于我无法纠正的大量错误而不允许我使用它。我的猜测是,这些错误是由于wsdl过时、名称空间不匹配或无法在包含的URL中找到内容造成的。如果我用当前web服务端点URL替换这些URL,它仍然不起作用

如果有人能指出我代码中的问题,或者指导我如何让“添加Web引用”工作,我将不胜感激


提前谢谢

SOAP只是您发布到服务的有效负载的格式,仅此而已。对于字段和名称空间等有一个定义的规范,也有不同的SOAP版本,但实际上没有那么多。(除了它的使用非常冗长之外,这是一个不同的主题。)

您需要从当前的WSDL开始。如果您知道您正在使用的WSDL已经过时,这意味着Web服务期望(必需)或可以使用(可选)的内容与您的定义不同。WSDL是您进入Web服务的契约网关。您需要获取当前的WSDL

幸运的是,当我在跳过证书错误后导航到(我通过在url末尾附加“?WSDL”来派生)时,宾果——服务使用了WSDL。您可以(a)在本地保存它,或者(b)在构建web服务客户端时直接从VisualStudio引用它。由于证书错误,我建议将其保存在本地并从那里构建

这应该让你开始