【问题标题】:Call a Java Soap Web Service Method with object parameter from C# Client从 C# 客户端调用带有对象参数的 Java Soap Web 服务方法
【发布时间】:2016-10-27 13:32:22
【问题描述】:

我想将对象列表作为输入传递给 Web 服务。 我开始知道我们无法使用 SSIS 中的内置 Web 服务任务来实现这一点。所以我尝试通过使用 C# 代码的脚本任务来调用它。 我可以通过脚本任务调用 Java Web 服务(SOAP)。 我可以通过将字符串等简单参数传递给 Web 服务方法来进行测试。 现在我想将对象列表作为参数传递给 Web 服务方法。 出于测试目的,我首先尝试传递一个对象。 c#客户端中的类如下

  [Serializable]
        public class Person
        {
            public string _PersonName;
            public string _PersonNumber;
            public string _Password;
            public bool _isTrue;
            public List<string> _configs;
            public Person()
            {
            }

            public Person(string PersonName, string PersonNumber, string Password, bool val)
            {
                _PersonName = PersonName;
                _PersonNumber = PersonNumber;
                _Password = Password;
                _isTrue = val;
                // _configs = config;        
            }
        }

对应的代理客户端类如下

public partial class person {

        private string _PersonNameField;

        private string _PersonNumberField;

        private string _PasswordField;

        private bool _isTrueField;

        private string[] _configsField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public string _PersonName {
            get {
                return this._PersonNameField;
            }
            set {
                this._PersonNameField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public string _PersonNumber {
            get {
                return this._PersonNumberField;
            }
            set {
                this._PersonNumberField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public string _Password {
            get {
                return this._PasswordField;
            }
            set {
                this._PasswordField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public bool _isTrue {
            get {
                return this._isTrueField;
            }
            set {
                this._isTrueField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("_configs", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
        public string[] _configs {
            get {
                return this._configsField;
            }
            set {
                this._configsField = value;
            }
        }
    }

代理类中的方法如下

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace="http://sample.xyz.abc.ext/", ResponseNamespace="http://sample.xyz.abc.ext/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        [return: System.Xml.Serialization.XmlElementAttribute("return", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public string createPerson([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] person arg0) {
            object[] results = this.Invoke("createJigBoard", new object[] {
                        arg0});
            return ((string)(results[0]));
        }

我在客户端调用方法如下

ServiceReference.TestService per = new ServiceReference.TestService();
 var testList=new List<string>();
 Person personOne = new Person("Manoj", "123456761", "Administrator", true,testList);
            NetworkCredential myCred = new NetworkCredential("person", "person");
            CredentialCache myCache = new CredentialCache();
            myCache.Add(new Uri("http://pcblr********:80/*******/servlet/TestService"), "Basic", myCred);            
            StringWriter textWriter = new StringWriter();
            XmlSerializer xmlSer = new XmlSerializer(typeof(Person));          
            xmlSer.Serialize(textWriter, personOne);
                       textWriter.Close();
            per.createPerson(personOne);

我收到了错误

Argument 1: cannot convert from 'Client.Person' to 'Proxyclass.person'  ******\ScriptMain.cs    

【问题讨论】:

    标签: java c# web-services soap ssis-2012


    【解决方案1】:

    错误信息是正确的。该服务需要一个 ProxyClass.person,但您发送的是一个 Client.Person。

    代替这一行:

    Person personOne = new Person("Manoj", "123456761", "Administrator", true,testList);
    

    您应该创建一个 ProxyClass.person-object 并手动映射参数或使用AutoMapper 或类似的。

    您还需要从

    更改序列化
    XmlSerializer xmlSer = new XmlSerializer(typeof(Person));
    

    XmlSerializer xmlSer = new XmlSerializer(typeof(ProxyClass.person));
    

    【讨论】:

    • 谢谢。现在我可以传递单个对象.. 我想传递 list 但它被视为对象数组。我更改了如下设置stackoverflow.com/questions/24621993/…
    • Web 服务会自动处理序列化。 List.ToArray() 工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    相关资源
    最近更新 更多