SOAP webservice时出现InvalidOperationException - 但是在dev机器

时间:2016-10-26 10:55:08

标签: c# web-services soap

我有一个继承自SoapHttpClientProtocol

的webservice类
[WebServiceBinding(Name = "gp_ws_mySoap", Namespace = "https://www.xxx/yyy/")]
internal class WebserviceNestle : SoapHttpClientProtocol
{
    public WebserviceNestle(string sUrl) : base()
    {
        Url = sUrl;
    }

    [SoapDocumentMethod("https://www.xxx/yyy/test",
    RequestNamespace = "https://www.xxx/yyy/",
    ResponseNamespace = "https://www.xxx/yyy/",
    Use = SoapBindingUse.Literal,
    ParameterStyle = SoapParameterStyle.Wrapped)]
    public XmlNode test(string a, int b)
    {
        var results = Invoke("test", new object[] {
            a,
            b
        });
        return (XmlNode)results[0];
    }
}

在我的开发机器上,webservice调用有效,但是在生产时,我得到异常“System.InvalidOperationException:来自命名空间的名为''的XML元素已经存在于当前作用域中:

异常的堆栈跟踪是:

  

System.InvalidOperationException:死   ?????????????????????????????????????????。???????? ????????????????????????????????? - 了Methode   kann nicht reflektiert werden。 ---> System.InvalidOperationException:   Fehler beim Reflektieren von''。 --->   System.InvalidOperationException:Das XML-Attribut''im Namespace   'https://www.yyy/xxx/'bereits im aktuellen Bereich   vorhanden。 Verwenden Sie XML-Attribute,um einen anderen XML-Namen   oder-NamespacefürdasElement anzugeben。   bei System.Xml.Serialization.XmlReflectionImporter.AddUniqueAccessor(INameScope   范围,访问者访问者)   bei System.Xml.Serialization.XmlReflectionImporter.AddUniqueAccessor(MemberMapping)   成员,INameScope元素,INameScope属性,布尔值   isSequence)   bei System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(XmlReflectionMember []   xmlReflectionMembers,String ns,Boolean hasWrapperElement,Boolean   rpc,Boolean openModel,RecursionLimiter limiter)--- Ende der   internenAusnahmestapelüberwachung---   bei System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(XmlReflectionMember []   xmlReflectionMembers,String ns,Boolean hasWrapperElement,Boolean   rpc,Boolean openModel,RecursionLimiter limiter)bei   System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(字符串   elementName,String ns,XmlReflectionMember [] members,Boolean   hasWrapperElement,Boolean rpc,Boolean openModel,XmlMappingAccess   访问)   bei System.Web.Services.Protocols.SoapReflector.ImportMembersMapping(XmlReflectionImporter   xmlImporter,SoapReflectionImporter soapImporter,Boolean   serviceDefaultIsEncoded,Boolean rpc,SoapBindingUse使用,   SoapParameterStyle paramStyle,String elementName,String   elementNamespace,Boolean nsIsDefault,XmlReflectionMember []成员,   Boolean validate,Boolean openModel,String key,Boolean writeAccess)   bei System.Web.Services.Protocols.SoapReflector.ReflectMethod(LogicalMethodInfo)   methodInfo,布尔客户端,XmlReflectionImporter xmlImporter,   SoapReflectionImporter soapImporter,String defaultNs)

2 个答案:

答案 0 :(得分:2)

我发现了问题:

我使用Confuser(https://yck1509.github.io/ConfuserEx/)来保护应用程序,这导致了SoapHttpClientProtocol父类构造函数中的反射错误。

答案 1 :(得分:1)

如果您不使用对象XML序列化程序,我的猜测会有效。

那么,如果您的某个属性必须包含空闲字符串值并且不是XML编码,那该怎么办呢?如果它包含与XML构建器用于引用属性值相同的引用字符,那么您可能会收到类似XML注入的内容。

例如,你必须传递一个字符串[那就是我所说的"一个真正的问题"]。如果您不对字符串进行XML编码,那么您将拥有类似的东西,这意味着属性值在[a] char之前关闭,而从[a]到右边的所有内容都变成了XML指令,而我不会这样做。期望普通的XML解析器能够理解。

如果您使用XML编码的值,您将收到(如果您已经定义了"和'实体或其他代码),这是一个结构良好的XML。

尝试使用SoapUI (they have a free community edition)分析服务响应。