如何在 C# 中调用 Web 服务

Posted

技术标签:

【中文标题】如何在 C# 中调用 Web 服务【英文标题】:How to call web Services in C# 【发布时间】:2021-01-06 00:29:36 【问题描述】:

我正在调用 Web 服务并返回列表,但我不能这样做。 我想将下拉列表与 Web 服务绑定。

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

示例 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":"Ar*** 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 类:

 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 类:

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);

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

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
        

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

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

GetInitiatorsListByWorkflow 方法返回 Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST 对象,而不是 List&lt;CountryList&gt;。同样,您的 GetCountriesName 方法返回 List&lt;CountryList&gt;,而不是您的(在显示的代码中未定义)lst 变量的类型。这就是你有错误的原因 - 你不能只是随机地将对象分配给错误类型的变量。

无论如何,对于您的国家/地区列表,您实际上希望使用 ALM_COUNTRY_M 类中的两个属性。 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 类的定义应该更像这样:

public class CountryList

    public string CountryCode  get; set; 
    public string CountryName  get; set; 


附:将CountryList 类重命名为Country 会更有意义,因为每个对象只代表一个国家。它是定义列表的List&lt;&gt; 部分。但这是一个由您决定的单独问题。

【讨论】:

以上是关于如何在 C# 中调用 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

从 C# .NET Core(特别是 Workday)调用 Java Web 服务。如何在soap请求中获取xml属性

创建 Restful Web 服务以在 C# 中调用存储过程

如何在我的可视 C# Web 服务中为我的 android 应用程序调用 LINQ 中的用户定义函数?

如何从 c# web 服务调用 c++ Opencv 项目?

如何从网页Javascript调用C#方法? [关闭]

如何使用 ASP.NET C# 在使用 ajax 完成 Web 服务时生成警报