【问题标题】:Recreate webservice重新创建网络服务
【发布时间】:2010-01-05 11:21:47
【问题描述】:

嗨,

我的工作是创建一个网络服务,它充当我们拥有的另一个网络服务,因此客户不会注意到其中的差异。我创建了整个 web 服务,它在我使用它时运行良好,并且输出都是相同的。问题是,我创建了一个使用旧 Web 服务的客户端应用程序,如果我将 Web 引用的 url 更改为新服务并重试,我会收到错误:

System.Web.Services.Protocols.SoapException: 服务器无法识别 HTTP 标头 SOAPAction

如果我查看我的两个 Web 服务中 Reference.cs 的差异,我会发现属性存在细微差异,我认为这是问题所在。

新服务:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.3053")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Web.Services.WebServiceBindingAttribute(Name="SprWebServiceSoap", Namespace="http://ws.hl7.trispark.com/")]
    public partial class SprWebService : System.Web.Services.Protocols.SoapHttpClientProtocol {

旧服务:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.3053")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Web.Services.WebServiceBindingAttribute(Name="SprWebServiceRemoteBinding", Namespace="http://ws.hl7.trispark.com/")]
    public partial class SprWebService : System.Web.Services.Protocols.SoapHttpClientProtocol {

而且使用的方法也不同:

新:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://ws.hl7.trispark.com/invoke", RequestNamespace="http://ws.hl7.trispark.com/", ResponseNamespace="http://ws.hl7.trispark.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        public invokeResponse invoke(invoke inv) {

旧:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("invokeResponse", Namespace="http://ws.hl7.trispark.com/types")]
        public invokeResponse invoke([System.Xml.Serialization.XmlElementAttribute("invoke", Namespace="http://ws.hl7.trispark.com/types")] invoke invoke1) {

首先我认为问题可能是我的版本是在 vs2008 中创建的,而旧版本是在 vs2005 中创建的,所以我在 2005 年重新创建了它,但这并没有改变任何东西。

问题是我没有旧代码的代码,所以我看不到使用了哪些特定属性。

有人知道我必须设置哪些属性才能获得相同的东西吗?

非常感谢!

【问题讨论】:

    标签: c# soap web-services reference


    【解决方案1】:

    你有旧服务的DLL吗?如果你有 DLL,如果它是一个 .net 服务,你可能会使用 Reflector 对其进行逆向工程。

    【讨论】:

    • 另一个 web 服务是用 java 创建的,所以这是不行的 :(
    • 你看过Java反编译器吗?如果您想 100% 确定,那可能是唯一的事情。只有其他方法是将 xsd / wsdl 与细节进行比较,以尝试让它们匹配。您可能会尝试的另一件事是像 SOAPScope 这样的产品,它允许您实际看到完整的 SOAP 数据包通过网络传输。然后您就可以从 SOAP 的角度推断出您需要的任何更改。
    【解决方案2】:

    我的猜测是检查使用的命名空间,我遇到了类似的问题,它深入研究是命名空间问题的差异。检查:

    [WebService(命名空间 = "http://tempuri.org/"]

    这是默认设置,可能在您的新 Web 服务中,而您的旧 Web 服务可能正在使用其他命名空间。

    【讨论】:

      【解决方案3】:

      尝试比较这两个服务的 WSDL - 看看你是否能找到任何线索。

      要获得它,您可以在 URL 的末尾添加 ?WSDL,分别参见 http://aspnet.15seconds.com/010430/SampleService.asmxhttp://aspnet.15seconds.com/010430/SampleService.asmx?WSDL 的示例。

      编辑:
      我不是 WSDL 专家,因此无法告诉您问题出在哪里。
      您可以考虑的另一个选择是将请求的嗅探与服务进行比较 - 这可以提供其他线索。

      【讨论】:

      【解决方案4】:

      我知道这是一个老问题,但如果您的目标是创建一个与旧服务完全相同的 Web 服务,您应该从旧服务的 WSDL 构建新服务。您可以使用 Visual Studio 自动执行此操作:

      http://bloggingabout.net/blogs/jschreuder/archive/2005/05/19/4124.aspx

      【讨论】:

        猜你喜欢
        • 2014-03-21
        • 1970-01-01
        • 2011-06-15
        • 2013-10-07
        • 2015-12-24
        • 1970-01-01
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多