如何在C#中调用网络服务

How to call web Services in C#

我正在调用 Web 服务并 return 进入列表,但我不能这样做。 我想用网络服务绑定下拉列表。

我添加了 INITIATORS_LIST class,其中包含我想在下拉列表中绑定的所有字段,例如公司、国家/地区、部门、位置...等等。我怎样才能实现我可以接受的任何替代方法?

样本JSON数据

{"Companies":[{"ACTIVE":true,"COMPANY_ID":1,"CompanyCode":"1000","CompanyName":"Almarai Company","CountryCode":"SAU","CountryName":"Saudi Arabia","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"ACTIVE":true,"COMPANY_ID":6,"CompanyCode":"4000","CompanyName":"Almarai Co. Bahrain WLL","CountryCode":"BAH","CountryName":"Bahrain","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"ACTIVE":true,"COMPANY_ID":8,"CompanyCode":"5000","CompanyName":"Bustan Al Khaleej Est.","CountryCode":"UAE","CountryName":"United Arab Emirates","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"ACTIVE":true,"COMPANY_ID":11,"CompanyCode":"5200","CompanyName":"ALMARAI EMIRATES COMPANY L.L.C","CountryCode":"UAE","CountryName":"United Arab Emirates","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"ACTIVE":true,"COMPANY_ID":15,"CompanyCode":"6000","CompanyName":"Al Kharafi Brothers","CountryCode":"KWT","CountryName":"Kuwait","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"ACTIVE":true,"COMPANY_ID":18,"CompanyCode":"7000","CompanyName":"Arabian Planets Company","CountryCode":"OMN","CountryName":"Oman","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"}],"Countries":[{"COUNTRY_ACTIVE":true,"COUNTRY_M_ID":1,"CountryCode":"SAU","CountryName":"Saudi Arabia","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"COUNTRY_ACTIVE":true,"COUNTRY_M_ID":3,"CountryCode":"UAE","CountryName":"United Arab Emirates","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"COUNTRY_ACTIVE":true,"COUNTRY_M_ID":4,"CountryCode":"BAH","CountryName":"Bahrain","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"COUNTRY_ACTIVE":true,"COUNTRY_M_ID":5,"CountryCode":"OMN","CountryName":"Oman","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"COUNTRY_ACTIVE":true,"COUNTRY_M_ID":7,"CountryCode":"KWT","CountryName":"Kuwait","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"}],"Divisions":[{"ACTIVE":true,"CompanyCode":null,"CompanyName":null,"CountryCode":null,"CountryName":null,"DB_CONNECTION_STRING":null,"DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales","WEB_URL":null}],"Locations":

ALM_COUNTRY_M class:

 public partial class ALM_COUNTRY_M : object, System.Runtime.Serialization.IExtensibleDataObject, 
        System.ComponentModel.INotifyPropertyChanged {
        
        [System.NonSerializedAttribute()]
        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private bool COUNTRY_ACTIVEField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private int COUNTRY_M_IDField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string CountryCodeField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string CountryNameField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string DivisionCodeField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private int DivisionIdField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string DivisionNameField;
        
        [global::System.ComponentModel.BrowsableAttribute(false)]
        public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
            get {
                return this.extensionDataField;
            }
            set {
                this.extensionDataField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public bool COUNTRY_ACTIVE {
            get {
                return this.COUNTRY_ACTIVEField;
            }
            set {
                if ((this.COUNTRY_ACTIVEField.Equals(value) != true)) {
                    this.COUNTRY_ACTIVEField = value;
                    this.RaisePropertyChanged("COUNTRY_ACTIVE");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public int COUNTRY_M_ID {
            get {
                return this.COUNTRY_M_IDField;
            }
            set {
                if ((this.COUNTRY_M_IDField.Equals(value) != true)) {
                    this.COUNTRY_M_IDField = value;
                    this.RaisePropertyChanged("COUNTRY_M_ID");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string CountryCode {
            get {
                return this.CountryCodeField;
            }
            set {
                if ((object.ReferenceEquals(this.CountryCodeField, value) != true)) {
                    this.CountryCodeField = value;
                    this.RaisePropertyChanged("CountryCode");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string CountryName {
            get {
                return this.CountryNameField;
            }
            set {
                if ((object.ReferenceEquals(this.CountryNameField, value) != true)) {
                    this.CountryNameField = value;
                    this.RaisePropertyChanged("CountryName");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string DivisionCode {
            get {
                return this.DivisionCodeField;
            }
            set {
                if ((object.ReferenceEquals(this.DivisionCodeField, value) != true)) {
                    this.DivisionCodeField = value;
                    this.RaisePropertyChanged("DivisionCode");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public int DivisionId {
            get {
                return this.DivisionIdField;
            }
            set {
                if ((this.DivisionIdField.Equals(value) != true)) {
                    this.DivisionIdField = value;
                    this.RaisePropertyChanged("DivisionId");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string DivisionName {
            get {
                return this.DivisionNameField;
            }
            set {
                if ((object.ReferenceEquals(this.DivisionNameField, value) != true)) {
                    this.DivisionNameField = value;
                    this.RaisePropertyChanged("DivisionName");
                }
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }

INITIATORS_LIST Class:

public partial class INITIATORS_LIST : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
        
        [System.NonSerializedAttribute()]
        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private Almarai.GiveAway.GetInitiatorList.ALM_COMPANY_M[] CompaniesField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private Almarai.GiveAway.GetInitiatorList.ALM_COUNTRY_M[] CountriesField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private Almarai.GiveAway.GetInitiatorList.ALM_DIVISION_M[] DivisionsField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private Almarai.GiveAway.GetInitiatorList.LOCATION[] LocationsField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private Almarai.GiveAway.GetInitiatorList.REGION[] RegionsField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private Almarai.GiveAway.GetInitiatorList.ALM_WKFLW_TYPE_M[] WorkflowTypesField;
        
        [global::System.ComponentModel.BrowsableAttribute(false)]
        public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
            get {
                return this.extensionDataField;
            }
            set {
                this.extensionDataField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public Almarai.GiveAway.GetInitiatorList.ALM_COMPANY_M[] Companies {
            get {
                return this.CompaniesField;
            }
            set {
                if ((object.ReferenceEquals(this.CompaniesField, value) != true)) {
                    this.CompaniesField = value;
                    this.RaisePropertyChanged("Companies");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public Almarai.GiveAway.GetInitiatorList.ALM_COUNTRY_M[] Countries {
            get {
                return this.CountriesField;
            }
            set {
                if ((object.ReferenceEquals(this.CountriesField, value) != true)) {
                    this.CountriesField = value;
                    this.RaisePropertyChanged("Countries");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public Almarai.GiveAway.GetInitiatorList.ALM_DIVISION_M[] Divisions {
            get {
                return this.DivisionsField;
            }
            set {
                if ((object.ReferenceEquals(this.DivisionsField, value) != true)) {
                    this.DivisionsField = value;
                    this.RaisePropertyChanged("Divisions");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public Almarai.GiveAway.GetInitiatorList.LOCATION[] Locations {
            get {
                return this.LocationsField;
            }
            set {
                if ((object.ReferenceEquals(this.LocationsField, value) != true)) {
                    this.LocationsField = value;
                    this.RaisePropertyChanged("Locations");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public Almarai.GiveAway.GetInitiatorList.REGION[] Regions {
            get {
                return this.RegionsField;
            }
            set {
                if ((object.ReferenceEquals(this.RegionsField, value) != true)) {
                    this.RegionsField = value;
                    this.RaisePropertyChanged("Regions");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public Almarai.GiveAway.GetInitiatorList.ALM_WKFLW_TYPE_M[] WorkflowTypes {
            get {
                return this.WorkflowTypesField;
            }
            set {
                if ((object.ReferenceEquals(this.WorkflowTypesField, value) != true)) {
                    this.WorkflowTypesField = value;
                    this.RaisePropertyChanged("WorkflowTypes");
                }
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }

参考:

public Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST GetInitiatorsListByWorkflow(string userId, string WorkflowTypeCode) {
            return base.Channel.GetInitiatorsListByWorkflow(userId, WorkflowTypeCode);
        }

[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IMasterDataService/GetInitiatorsListByWorkflow", ReplyAction="http://tempuri.org/IMasterDataService/GetInitiatorsListByWorkflowResponse")]
        [System.ServiceModel.FaultContractAttribute(typeof(Almarai.GiveAway.GetInitiatorList.CustomFaultException), Action="http://tempuri.org/IMasterDataService/GetInitiatorsListByWorkflowCustomFaultExcep" +
            "tionFault", Name="CustomFaultException", Namespace="http://schemas.datacontract.org/2004/07/Almarai.Web.Services.MasterData")]
        Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST GetInitiatorsListByWorkflow(string userId, string WorkflowTypeCode);

国家class:(我是否应该为公司、国家、地区等每个不同的字段更改此class……等等)

public class CountryList
        {
            public CountryList(INITIATORS_LIST data)
            {
                ExtensionData = data;
            }

            public INITIATORS_LIST ExtensionData { get; internal set; }
        }

我的方法:(我应该如何修改我的方法)

 [WebMethod]
        public static List<CountryList> GetCountriesName(string UserID)
        {
            GetInitiatorList.MasterDataServiceClient oClient = new GetInitiatorList.MasterDataServiceClient();
            string userid = "approver01";
            string work = "4";
            List<CountryList> countries = oClient.GetInitiatorsListByWorkflow(userid, work); // Error on this line 

            foreach (Country c in countries)
            {
                lst.Add(c.Name);
            }

            return lst; //Error on this line
        }

我无法添加到列表中还有其他方法吗? 我知道由于 return 类型我无法做到,但是

GetInitiatorsListByWorkflow 方法returns 一个 Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST 对象,而不是 List<CountryList>。同样,您的 GetCountriesName 方法 returns List<CountryList>,而不是您的(代码中未定义的)lst 变量的类型。这就是为什么你有错误 - 你不能只是随机地将对象分配给错误类型的变量。

无论如何,对于您的国家/地区列表,您似乎实际上想要使用 ALM_COUNTRY_M class 中的两个属性。 INITIATORS_LIST 包含该类型的对象数组。

所以你真正需要做的是从 GetInitiatorsListByWorkflow 方法返回的 INITIATORS_LIST 中获取 ALM_COUNTRY_M 对象的数组,并循环遍历它们,对于每个对象,创建 CountryList 的等效实例,使用 ALM_COUNTRY_M 对象中的值设置其属性,并将其添加到要返回的列表中。

像这样(未经测试):

[WebMethod]
public static List<CountryList> GetCountriesName(string UserID)
{
    GetInitiatorList.MasterDataServiceClient oClient = new GetInitiatorList.MasterDataServiceClient();
    string userid = "approver01";
    string work = "4";

    Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST initiatorsList = oClient.GetInitiatorsListByWorkflow(userid, work); //get data from webservice
    Almarai.GiveAway.GetInitiatorList.ALM_COUNTRY_M[] countryMList = initiatorsList.Countries; //get list of countries from the data returned by the webservice

    List<CountryList> countries = new List<CountryList>(); //create an empty list which will be populated with data from the webservice

    //loop through list of countries returned from webservice
    foreach (Almarai.GiveAway.GetInitiatorList.ALM_COUNTRY_M country in countryMList)
    {
       //add new instance of CountryList using fields from the webservice class
       countries.Add(new CountryList() {
         CountryCode = country.CountryCode,
         CountryName = country.CountryName
       });
    }

    return countries; //return the completed list of countries
}

CountryList class 应该更像这样定义:

public class CountryList
{
    public string CountryCode { get; set; }
    public string CountryName { get; set; }

}

P.S。将 CountryList class 重命名为 Country 会更有意义,因为每个对象只代表一个国家。它是定义列表的 List<> 部分。但这是一个单独的问题,由您决定。