在 C# 中创建客户端以调用没有 WSDL 的 Web 服务



我需要在不知道 wsdl 的情况下连接到 Web 服务;我唯一的信息是下面这样的示例请求,但我不知道从哪里开始构建这个 xml;例如什么是 wsse:BinarySecurityToken? 我是否还必须创建前缀,如"wsu"或"wsse"???

以下信息来自测试服务器,因此此处披露了任何敏感数据。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
        <wsse:UsernameToken wsu:Id="Username-123" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:Username>gen-emiswebmobile.e-mis.co.uk</wsse:Username>
        </wsse:UsernameToken>
        <wsu:Timestamp wsu:Id="Timestamp-1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsu:Created>2017-06-29T22:42:44.870Z</wsu:Created>
            <wsu:Expires>2017-06-29T22:57:44.870Z</wsu:Expires>
        </wsu:Timestamp>
        <wsse:BinarySecurityToken wsu:Id="CertId-4468839874371617328" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">MIIFVjCCBD6gAwIBAgIHTvS0LmWypjANBgkqhkiG9w0BAQsFADCBtDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMS0wKwYDVQQLEyRodHRwOi8vY2VydHMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS8xMzAxBgNVBAMTKkdvIERhZGR5IFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjAeFw0xNDEwMDgwNzMzNDdaFw0xNjEwMDgwNzMzNDdaMEsxITAfBgNVBAsTGERvbWFpbiBDb250cm9sIFZhbGlkYXRlZDEmMCQGA1UEAxMdZ2VuLWVtaXN3ZWJtb2JpbGUuZS1taXMuY28udWswggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzpXaDzByOKYA0C1MCa2fzDzazgiJBqfHh08/kb4cf/8Vceu1mTst1ggVOrvIpTVf+jUmj05OYI1I5gSEUN+mEXOJv/mK5Fmalx+i7lIxRa3xT47KMcbAmmTzr1IY8CQUMGQhW7idDU680R2eO2n5x1q+2icViQb/Ooa23eBWgH+BwxhUqpi2NrvbHC/Xg3A8tkiIeZCsm5eyVbrzQykbFyeAKhX5ZBw+P0EKJB+mvfQ7clmyGbcBwNw3nPWscxOO2w/OYd7bh7VLiRK3Mgz6OYL3fHMc/tDsEXKXL1j+60ZVJXtZNrFykWNFsA14EV+unouf0cUZqi8kDhvG8ae+DAgMBAAGjggHTMIIBzzAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAOBgNVHQ8BAf8EBAMCBaAwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nb2RhZGR5LmNvbS9nZGlnMnMxLTg3LmNybDBTBgNVHSAETDBKMEgGC2CGSAGG/W0BBxcBMDkwNwYIKwYBBQUHAgEWK2h0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS8wdgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5nb2RhZGR5LmNvbS8wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS9nZGlnMi5jcnQwHwYDVR0jBBgwFoAUQMK9J47MNIMwojPX+2yz8LQsgM4wSwYDVR0RBEQwQoIdZ2VuLWVtaXN3ZWJtb2JpbGUuZS1taXMuY28udWuCIXd3dy5nZW4tZW1pc3dlYm1vYmlsZS5lLW1pcy5jby51azAdBgNVHQ4EFgQUfnm7SRUsh4sUkMHC41QY+Q3ysZ0wDQYJKoZIhvcNAQELBQADggEBAK3zIhwhU3N7bxGjRVTFsQDLvJBjrIeJiRHXTtPF8A/muYJdcapUTcz/cl8mu9hXN3po0WJQii2kttBQD7MAjHlIMDDY6iTDrEorqch0OUSc6tJe6KQlNdeE4Cng11/AlcTBNitxE8aNiC8PUsh4P4Se8jDNoa7ESSgv9MXpHUT+Dfx5wsM4CPkUMhdaQiPQPL4QzbwpphX+hD4DTGGkKR34HR91HLoUap/gOS97ZTUmUBtgOSSKGL+kVrs+HKA6+Zbv55ya0bYFHJikN/5R1XUgZX6l3VZJJvBnmFHETd2I6H/1/VKOiSoD4JNZf7cxfDRmi8cLixE6PdSM41ve6qw=</wsse:BinarySecurityToken>
        <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
            <SignedInfo>
                <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
                <Reference URI="#Timestamp-1">
                    <Transforms>
                        <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                    </Transforms>
                    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                    <DigestValue>WOHqa2p3/ZcVQ2FU36OEU9gfYaI=</DigestValue>
                </Reference>
            </SignedInfo>
            <SignatureValue>q/ZGfYAacr6Vv/LwfyAwyxXGLVkJ7qXJYkMvrCludwNRaENHNR1LekPwVuMGQ95uoKzk9npEnefHrCD1+JmufKltDtXLIZmhUJNryhOcUHzSoDLjdCAOJ+Ylccf73fhI7uHJr63NlbmV6IVzTrb3RPpfoJDpuDqyrkqS0l4HQI3BkzbDYR3Eo3ce8oUzfZ32xpLTQ/LceI6DsaHMCtimxjhAJDa1NuRDbsosHgxw8MEms1hc5VwR4s2/h6GJEkz5EXegWkm9CBNlpgceaFF7HMUPZqm7PUTHTrsmfN9uEZlp4iaUQrCBPNwsju3dbD1nOxNAxQeGvx5RNL0xvY5emg==</SignatureValue>
            <KeyInfo Id="KeyId-4468839874371617327">
                <wsse:SecurityTokenReference wsu:Id="STRId-3E04823056058230" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
                    <wsse:Reference ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" URI="#CertId-4468839874371617328" />
                </wsse:SecurityTokenReference>
            </KeyInfo>
        </Signature>
    </wsse:Security>
    <Action xmlns="http://www.w3.org/2005/08/addressing">MiG</Action>
    <MessageID xmlns="http://www.w3.org/2005/08/addressing">84CF41DA-133A-442D-979B-D76697AF71BF</MessageID>
    <To xmlns="http://www.w3.org/2005/08/addressing">https://185.13.72.96/Miggateway</To>
    <ReplyTo xmlns="http://www.w3.org/2005/08/addressing">
        <Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
    </ReplyTo>
</soap:Header>
<soap:Body>
    <q1:migRequest xmlns:q1="http://www.healthcaregateway.co.uk/mig">
        <q1:serviceDefinition>
            <q1:name>MIG.DATAEXTRACTIONSERVICE.EhrExtractRequest</q1:name>
            <q1:version>0.0.2</q1:version>
        </q1:serviceDefinition>
        <q1:serviceHeader>
            <q1:source xmlns:q1="http://www.healthcaregateway.co.uk/mig">
                <q1:identifier>externaldevuser:urn:hgl:addressing:ods:N00001</q1:identifier>
            </q1:source>
            <q1:target xmlns:q1="http://www.healthcaregateway.co.uk/mig">
                <q1:nationalCode>urn:hgl:addressing:ods:A00005</q1:nationalCode>
            </q1:target>
        </q1:serviceHeader>
        <q1:serviceContent>
            <q1:ehrExtractRequestv2-0 xmlns:q1="http://www.healthcaregateway.co.uk/mig">
                <q1:id>4df5cdb1-4a20-42a5-b604-6033eec5224d</q1:id>
                <q1:consent>
                    <q1:value>Given</q1:value>
                </q1:consent>
                <q1:provenance>
                    <q1:creationTime>2013-07-15T14:37:28.7273043Z</q1:creationTime>
                    <q1:system>
                        <q1:id>BED045C0-BC58-4934-8E11-2FC08F730060</q1:id>
                        <q1:name>EMISWebCR1 50002</q1:name>
                    </q1:system>
                </q1:provenance>
                <q1:patient>
                    <q1:primaryIdentifier type="NHS">8888888888</q1:primaryIdentifier>
                </q1:patient>
                <q1:requestSpecification>
                    <q1:id>654d8e02-6b09-4754-a095-968c397db560</q1:id>
                    <q1:responseFormat>OPENHR</q1:responseFormat>
                    <q1:request>
                        <q1:name>scm.diagnosis</q1:name>
                        <q1:includeAssociatedText>true</q1:includeAssociatedText>
                    </q1:request>
                </q1:requestSpecification>
            </q1:ehrExtractRequestv2-0>
        </q1:serviceContent>
    </q1:migRequest>
</soap:Body>

您可以在此处查找一些代码示例。

您发布的 xml 是肥皂信封 xml,您应该能够按照示例中所示(使用 LoadXml(发送它并获得响应。(在您发布的 xml 中,您使用 migRequest 调用 MiG 操作(。

如果您没有肥皂信封请求,则必须创建一个,如果您不知道要调用哪些函数,这是棘手的部分。
请求的结构是这样的:(在您的示例中,还有此处不存在的安全性(

<?xml version="1.0" encoding="utf-8"?>
 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <MethodFoo>
      <param1>value</param1>
      <param2>value</param1>
    </MethodFoo>
  </soap:Body>
</soap:Envelope>

有关请求消息结构的更多信息,请在此处查找。

有几种方法可以连接到 Web 服务。基本上,您使用其中一个类将确切的 xml "发布"到 URL。

常见的方法是使用WebClient,HttpClient。将 xml 发布到 URL 相对简单。

如果我理解正确,您正在寻找如何以所需的确切格式构造 Xml 的方法。

我们处理类似请求的一种方法是通过以下方法。

获取示例 xml 并将其转换为模板

例如,

<q1:system>
    <q1:id>BED045C0-BC58-4934-8E11-2FC08F730060</q1:id>
    <q1:name>EMISWebCR1 50002</q1:name>
</q1:system>

成为

<q1:system>
    <q1:id>~system_id~</q1:id>
    <q1:name>~system_name~</q1:name>
</q1:system>

在上面的示例~system_id~中,~system_name~是占位符。在应用程序代码中,执行查找并替换为实际值。

这看起来确实像"低调"...但是在过去(即,在我们到处都有XML之前(,这是一种流行的方法:-(

另一种更 Xml 的方法是以确切的格式构造 C# 类。使用相关值填充对象。然后将 C# 类序列化为 xml 并将其发布到 URL。有一些流行的SO链接: 从 XML 生成 C# 类

最新更新