如何在 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<CountryList>
。同样,您的 GetCountriesName
方法返回 List<CountryList>
,而不是您的(在显示的代码中未定义)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<>
部分。但这是一个由您决定的单独问题。
【讨论】:
以上是关于如何在 C# 中调用 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章
从 C# .NET Core(特别是 Workday)调用 Java Web 服务。如何在soap请求中获取xml属性
创建 Restful Web 服务以在 C# 中调用存储过程
如何在我的可视 C# Web 服务中为我的 android 应用程序调用 LINQ 中的用户定义函数?