繁体   English   中英

在asp.net web service(ASMX)中调用自定义WSDL

[英]Calling custom WSDL in asp.net web service(ASMX)

我有一个webservice 我需要调用一个custom WSDL ,并对字段等进行一些验证。我已经阅读了一些文章并完成了一些我将在下面展示的步骤。

1)C#代码后面

[WebService(Namespace = "http://tempuri.org/")]
//[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[WebServiceBinding(Name = "CustomWSDL", Location = "http://localhost:62783/Service1.wsdl")]

public class Service : System.Web.Services.WebService
{
    public Service () {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    [SoapDocumentMethod(Action = "urn:foo-com:service/HelloWorld", Binding = "CustomWSDL")]
    public string HelloWorld(string i) {
        return "Hello World";
    }
}

该位置被设置为 service1.wsdl。 然后我改为只检查它。

现在,我的WSDL看起来像这样。

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
      <s:element name="HelloWorld">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="i" >
              <s:simpleType>
                <s:restriction base="s:string">
                  <s:minLength value="1"/>
                </s:restriction>
              </s:simpleType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="HelloWorldResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="HelloWorldResult">
              <s:simpleType>
                <s:restriction base="s:string">
                  <s:minLength value="1"/>
                </s:restriction>
              </s:simpleType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="HelloWorldSoapIn">
    <wsdl:part name="parameters" element="tns:HelloWorld" />
  </wsdl:message>
  <wsdl:message name="HelloWorldSoapOut">
    <wsdl:part name="parameters" element="tns:HelloWorldResponse" />
  </wsdl:message>
  <wsdl:portType name="ServiceSoap">
    <wsdl:operation name="HelloWorld">
      <wsdl:input message="tns:HelloWorldSoapIn" />
      <wsdl:output message="tns:HelloWorldSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="ServiceSoap" type="tns:ServiceSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="HelloWorld">
      <soap:operation soapAction="http://tempuri.org/HelloWorld" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="ServiceSoap12" type="tns:ServiceSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="HelloWorld">
      <soap12:operation soapAction="http://tempuri.org/HelloWorld" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <!--<wsdl:service name="Service">
    <wsdl:port name="ServiceSoap" binding="tns:ServiceSoap">
      <soap:address location="http://localhost:62783/Service.asmx" />
    </wsdl:port>
    <wsdl:port name="ServiceSoap12" binding="tns:ServiceSoap12">
      <soap12:address location="http://localhost:62783/Service.asmx" />
    </wsdl:port>
  </wsdl:service>-->
</wsdl:definitions>

根据作者的说法,应该对wsdl:service进行评论。 所以,它的评论。

由于我需要使用自定义 WSDL,因此我在使用WsiProfiles.BasicProfile1_1遇到了一个问题。 所以,我不得不使用 web.config 删除它。

 <system.web>
    <webServices>
      <conformanceWarnings>
        <remove name='BasicProfile1_1'/>
      </conformanceWarnings>
    </webServices>

所以,进入主要部分。

我的 Webservice 编译成功,没有任何错误。 现在,我将 webservice 导入应用程序,并且我正在获取我的新 WSDL 以及自动生成的WSDL 但是,当我尝试构建语句时,它给了我一个错误。

Element binding named CustomWSDL from namespace http://tempuri.org/ is missing.

我浏览了 MSDN 和其他一些关于此错误的文章,但没有一篇可以解决我的问题。

我在创建这个 WSDL 时犯了什么错误?


注意:我的参考: http ://craigandera.blogspot.com/2005/12/using-custom-wsdl-file-in-aspnet-web_15.html

我做了他在博客中描述的完全相同的事情。

您确定需要将其作为 ASMX 服务吗? 该技术堆栈已被Windows Communication Foundation取代。 在该堆栈中更好地完成新的开发。

我将使用 ASMX 工具堆栈回答您的问题。

您可以按照您尝试的方式手工制作服务实现,但让工具为您完成繁重的工作要容易得多。

对于 asmx,该工具称为Web 服务描述语言工具 (wsdl.exe) ,如果您启动 Visual Studio 命令提示符,则该工具位于您的路径中。

wsdl.exe
使用 ASP.NET 从 WSDL 合同文件、XSD 架构和 .discomap 发现文档为 xml web 服务客户端和 xml web 服务生成代码的实用程序。 此工具可与disco.exe 结合使用。

我复制了您的 wsdl 并将其保存在一个文件中。 之后,我运行 wsdl 工具来指导它为我生成服务器实现:

wsdl /serverInterface /n:Any.AweSome.NameSpace /l:csharp custom.wsdl

用法: wsdl.exe <options> <url or path> <url or path> ...

使用的选项:

  • /serverInterface
    为 ASP.Net Web 服务的服务器端实现生成接口。 为 wsdl 文档中的每个绑定生成一个接口。 wsdl 单独实现了 wsdl 契约(实现接口的类不应在类方法中包含以下任何一项:Web 服务属性或更改 wsdl 契约的序列化属性)。 简写为“/si”。

  • /language:<language>
    用于生成的代理类的语言。 从“CS”、“VB”、“JS”、“VJS”、“CPP”中进行选择,或者为实现 System.CodeDom.Compiler.CodeDomProvider 的类提供完全限定的名称。 默认语言是“CS”(CSharp)。 缩写形式是“/l:”。

  • /namespace:<namespace>生成的代理或模板的命名空间。 默认命名空间是全局命名空间。 缩写形式是“/n:”。 1

结果是您的服务实现应该实现的接口:

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.1")]
[System.Web.Services.WebServiceBindingAttribute(Name="ServiceSoap", Namespace="http://tempuri.org/")]
public interface IServiceSoap {

    /// <remarks/>
    [System.Web.Services.WebMethodAttribute()]
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/HelloWorld", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    string HelloWorld(string i);
}

根据此输出,您可以从当前的尝试中推断出错误/缺失的内容:

  • [WebServiceBinding(Name = "CustomWSDL"..]不应该是 CustomWSDL 而是ServiceSoap
  • SoapDocumentMethod 需要一组完全不同的属性。

我建议您通过生成一个接口来更改当前的实现并按如下方式实现该接口,将注释留在接口类中:

// at the top of the file add
using Any.AweSome.NameSpace;

// NO MORE ATTRIBUTES HERE! 
// NOTICE the IServiceSoap at the end
public class Service : System.Web.Services.WebService, IServiceSoap 
{
      // AND ALSO NO MORE ATTRIBUTES HERE
      public string HelloWorld(string i)
      {
          return "foo";
      }
}

如果将来由于某种原因 WSDL 以及生成的接口发生变化,您可以轻松地为新接口调整现有的实现。

1.命名空间不是强制性的,如果您不添加该选项,则接口将在global::命名空间中生成,您需要将其添加到您的界面前面。

[WebServiceBinding(Name = "CustomWSDL", Location = "Service1.wsdl")]更改为[WebServiceBinding(Name = "ServiceSoap", Location = "Service1.wsdl")]

提供的链接中的说明为“Name 属性给出了自定义 WSDL 的名称,ASP.NET 需要它以允许它正确地将调用分派到您的实现上。”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM