Why won't my SOAP XML response deserialize in C#? - c#

My soap service call is returning the following response:
<AssetList xmlns="http://schemas.datacontract.org/2004/07/XOSDigital.Assets" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Facets xmlns:a="http://schemas.datacontract.org/2004/07/XOSDigital.Business_Classes.Search"/>
<Results/>
<err i:nil="true"/>
<offset>0</offset>
<total>0</total>
</AssetList>
When I attempt to serialize this via:
AssetList assets;
var serializer = new XmlSerializer(typeof(AssetList));
assets = (AssetList)serializer.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(response.Content)));
I get the following exception:
<AssetList xmlns='http://schemas.datacontract.org/2004/07/XOSDigital.Assets'> was not expected.
The AssetList object I am trying to deserialize to was automatically generated by updating my service reference against the same exact service I am calling with my GET request.
Why is this failing?
The AssetList class is generated as:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="AssetList", Namespace="http://schemas.datacontract.org/2004/07/XOSDigital.Assets")]
[System.SerializableAttribute()]
public partial class AssetList : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
[System.NonSerializedAttribute()]
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private XOSDigital.XOSSuperfanAdminList.XosAssetWebService.AvailableFacetGroup[] FacetsField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private XOSDigital.XOSSuperfanAdminList.XosAssetWebService.Asset[] ResultsField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string errField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private int offsetField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private int totalField;
[global::System.ComponentModel.BrowsableAttribute(false)]
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public XOSDigital.XOSSuperfanAdminList.XosAssetWebService.AvailableFacetGroup[] Facets {
get {
return this.FacetsField;
}
set {
if ((object.ReferenceEquals(this.FacetsField, value) != true)) {
this.FacetsField = value;
this.RaisePropertyChanged("Facets");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public XOSDigital.XOSSuperfanAdminList.XosAssetWebService.Asset[] Results {
get {
return this.ResultsField;
}
set {
if ((object.ReferenceEquals(this.ResultsField, value) != true)) {
this.ResultsField = value;
this.RaisePropertyChanged("Results");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string err {
get {
return this.errField;
}
set {
if ((object.ReferenceEquals(this.errField, value) != true)) {
this.errField = value;
this.RaisePropertyChanged("err");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public int offset {
get {
return this.offsetField;
}
set {
if ((this.offsetField.Equals(value) != true)) {
this.offsetField = value;
this.RaisePropertyChanged("offset");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public int total {
get {
return this.totalField;
}
set {
if ((this.totalField.Equals(value) != true)) {
this.totalField = value;
this.RaisePropertyChanged("total");
}
}
}
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));
}
}
}

I think the problem is related with namespaces.
Can you try this?
var serializer = new XmlSerializer(typeof(AssetList),"http://schemas.datacontract.org/2004/07/XOSDigital.Assets");

Try to add this as the first line in your xml:
<?xml version="1.0"?>
Also, add XmlRoot attribute with namespace to your AssetList class:
[XmlRoot("AssetList", Namespace = "http://schemas.datacontract.org/2004/07/XOSDigital.Assets")]

Related

How to store IExtensibleDataObject into list in C#

I want to call web services and store in List but not able to add i know the return type is not matching for both.
May i know how to consume web service and store in List.
I have class which inherit with object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
Should I use LINQ.
Signature of GetInitiatorsListByWorkflow:
public Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST GetInitiatorsListByWorkflow(string userId, string WorkflowTypeCode) {
return base.Channel.GetInitiatorsListByWorkflow(userId, WorkflowTypeCode);
}
Refrence:
[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);
My 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;
[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));
}
}
}
My method:
[WebMethod]
public static List<INITIATORS_LIST> GetCountriesName(string UserID)
{
GetInitiatorList.MasterDataServiceClient oClient = new GetInitiatorList.MasterDataServiceClient();
List<INITIATORS_LIST> lst = new List<INITIATORS_LIST>();
var INITIATORS_LIST = new INITIATORS_LIST()
{
ExtensionData =
oClient.GetInitiatorsListByWorkflow("SAU", "SaudiArebia")//Error on this Line
};
return lst;
}

How to call web Services in C#

I am calling web services and returning into list but I am not able to do same.
I want to bind drop down list with web services.
I have added INITIATORS_LIST class which contain all field which I want to bind in Drop down list like Companies, Countries, Divisions, Location... So on. How can I achieve any alternate method may I accept please ?
Sample JSON Data
{"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));
}
}
}
Reference:
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);
Country class: (Should I change this class for Each different field like Company, Country, Region....so on)
public class CountryList
{
public CountryList(INITIATORS_LIST data)
{
ExtensionData = data;
}
public INITIATORS_LIST ExtensionData { get; internal set; }
}
My Method: (How should I modify my method)
[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
}
I am not able to Add into list is there other approch ?
I know due to return type am not able to do but
The GetInitiatorsListByWorkflow method returns a Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST object, not a List<CountryList>. Likewise your GetCountriesName method returns List<CountryList>, not whatever the type of your (undefined in the code shown) lst variable is. That's why you have errors - you can't just randomly assign objects to variables which are the wrong type.
Anyway it seems that for your countries list you actually want to use two properties from the ALM_COUNTRY_M class. The INITIATORS_LIST contains an array of objects of that type.
So what you really need to do is get the array of ALM_COUNTRY_M objects from the INITIATORS_LIST returned by the GetInitiatorsListByWorkflow method, and loop through them, and for each one, create an equivalent instance of CountryList, set its properties using the values in the ALM_COUNTRY_M object, and add that to the list to be returned.
Something like this (untested):
[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
}
The CountryList class should be defined more like this:
public class CountryList
{
public string CountryCode { get; set; }
public string CountryName { get; set; }
}
P.S. It would be more meaningful to rename the CountryList class to Country, since each object only represents a single country. It's the List<> part which defines a list. But that's a separate issue for you to decide.

System.NullReferenceException when using WSDL in C# SOAP Request

Another Similar But cant figure out Problem Tried the answer which worked for previous question in this same post, Which was for Arrays. Over here it is lookups and iv tried the below but its still not working. Iv also tried
createCustomerRequest.CustomerDetails.Title[0].Code[0] = cloneTitleCode[0];
All the [0] iv switched them around and took them off too and tried all the combinations still doesnt work.
//Security settings to match server using this line: -
Dsoapui.https.protocols=SSLv3,TLSv1.2 ...
BasicHttpsBinding httpsBinding = new
BasicHttpsBinding(BasicHttpsSecurityMode.Transport);
//Using the security settings to create the client which will let us send/recieve the requests...
CustomerServiceClient soapClient = new CustomerServiceClient("BasicHttpsBinding_ICustomerService");
//Set credentials for the client...
soapClient.ClientCredentials.UserName.UserName = username;
soapClient.ClientCredentials.UserName.Password = password;
//Create instances of requesting and recieving data from the server for customerDetails...
CreateCustomer createCustomer = new CreateCustomer();
CreateCustomerRequest createCustomerRequest = new CreateCustomerRequest();
CreateCustomerResponse createCustomerResponse = new CreateCustomerResponse();
//Set customer details request (so whatever will be included in the request to recieve the info)...
createCustomerRequest.UserName = username;
createCustomerRequest.Password = password;
createCustomerRequest.SystemToken = "2fa192c3-1215-41f9-be71-2ba6e279494e";
//Get current time to generate unique customer number...
string currentTime = DateTime.Now.ToLongTimeString();
string cleanTime = Regex.Replace(currentTime, "[^A-Za-z0-9 ]", "");
//For WSDL arrays create the array and instance then use it like below...
createCustomerRequest.CustomerDetails.Title = new CustomerServiceWSDL.LookupItem();
createCustomerRequest.CustomerDetails = new CreateCustomer();
createCustomerRequest.CustomerDetails.CustomerNumber = "001" + cleanTime;
createCustomerRequest.CustomerDetails.FirstName = cloneFirstName;
createCustomerRequest.CustomerDetails.Surname = cloneSurName;
createCustomerRequest.CustomerDetails.Title.Code = cloneTitleCode;
WSDL Reference for everything im playing with in this code:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="CreateCustomer", Namespace= + WEBAPI)]
[System.SerializableAttribute()]
public partial class CreateCustomer : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
[System.NonSerializedAttribute()]
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem BranchField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem BusinessSourceField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.ContactInformation ContactDetailsField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string CreatedByField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private System.Nullable<System.DateTime> CreationDateField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private System.Nullable<decimal> CreditLimitField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.Residence CurrentAddressField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string CustomerNumberField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private System.DateTime DateOfBirthField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem EmploymentStatusField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string FirstNameField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.Gender GenderField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string IdNumberField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string InitialsField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem MaritalStatusField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string NationalInsuranceNumberField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem NationalityField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private bool NoMailMarketingField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private System.Nullable<int> NoOfChildrenField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private bool NoThirdPartyMarketingField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem OccupationField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string PreviousNameField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private System.Nullable<System.DateTime> ReviewDateField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem StatusField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string SurnameField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem TitleField;
[global::System.ComponentModel.BrowsableAttribute(false)]
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem Branch {
get {
return this.BranchField;
}
set {
if ((object.ReferenceEquals(this.BranchField, value) != true)) {
this.BranchField = value;
this.RaisePropertyChanged("Branch");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem BusinessSource {
get {
return this.BusinessSourceField;
}
set {
if ((object.ReferenceEquals(this.BusinessSourceField, value) != true)) {
this.BusinessSourceField = value;
this.RaisePropertyChanged("BusinessSource");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.ContactInformation ContactDetails {
get {
return this.ContactDetailsField;
}
set {
if ((object.ReferenceEquals(this.ContactDetailsField, value) != true)) {
this.ContactDetailsField = value;
this.RaisePropertyChanged("ContactDetails");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string CreatedBy {
get {
return this.CreatedByField;
}
set {
if ((object.ReferenceEquals(this.CreatedByField, value) != true)) {
this.CreatedByField = value;
this.RaisePropertyChanged("CreatedBy");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public System.Nullable<System.DateTime> CreationDate {
get {
return this.CreationDateField;
}
set {
if ((this.CreationDateField.Equals(value) != true)) {
this.CreationDateField = value;
this.RaisePropertyChanged("CreationDate");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public System.Nullable<decimal> CreditLimit {
get {
return this.CreditLimitField;
}
set {
if ((this.CreditLimitField.Equals(value) != true)) {
this.CreditLimitField = value;
this.RaisePropertyChanged("CreditLimit");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.Residence CurrentAddress {
get {
return this.CurrentAddressField;
}
set {
if ((object.ReferenceEquals(this.CurrentAddressField, value) != true)) {
this.CurrentAddressField = value;
this.RaisePropertyChanged("CurrentAddress");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string CustomerNumber {
get {
return this.CustomerNumberField;
}
set {
if ((object.ReferenceEquals(this.CustomerNumberField, value) != true)) {
this.CustomerNumberField = value;
this.RaisePropertyChanged("CustomerNumber");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public System.DateTime DateOfBirth {
get {
return this.DateOfBirthField;
}
set {
if ((this.DateOfBirthField.Equals(value) != true)) {
this.DateOfBirthField = value;
this.RaisePropertyChanged("DateOfBirth");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem EmploymentStatus {
get {
return this.EmploymentStatusField;
}
set {
if ((object.ReferenceEquals(this.EmploymentStatusField, value) != true)) {
this.EmploymentStatusField = value;
this.RaisePropertyChanged("EmploymentStatus");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string FirstName {
get {
return this.FirstNameField;
}
set {
if ((object.ReferenceEquals(this.FirstNameField, value) != true)) {
this.FirstNameField = value;
this.RaisePropertyChanged("FirstName");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string Surname
{
get
{
return this.SurnameField;
}
set
{
if ((object.ReferenceEquals(this.SurnameField, value) != true))
{
this.SurnameField = value;
this.RaisePropertyChanged("Surname");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.Gender Gender {
get {
return this.GenderField;
}
set {
if ((this.GenderField.Equals(value) != true)) {
this.GenderField = value;
this.RaisePropertyChanged("Gender");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string IdNumber {
get {
return this.IdNumberField;
}
set {
if ((object.ReferenceEquals(this.IdNumberField, value) != true)) {
this.IdNumberField = value;
this.RaisePropertyChanged("IdNumber");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string Initials {
get {
return this.InitialsField;
}
set {
if ((object.ReferenceEquals(this.InitialsField, value) != true)) {
this.InitialsField = value;
this.RaisePropertyChanged("Initials");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem MaritalStatus {
get {
return this.MaritalStatusField;
}
set {
if ((object.ReferenceEquals(this.MaritalStatusField, value) != true)) {
this.MaritalStatusField = value;
this.RaisePropertyChanged("MaritalStatus");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string NationalInsuranceNumber {
get {
return this.NationalInsuranceNumberField;
}
set {
if ((object.ReferenceEquals(this.NationalInsuranceNumberField, value) != true)) {
this.NationalInsuranceNumberField = value;
this.RaisePropertyChanged("NationalInsuranceNumber");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem Nationality {
get {
return this.NationalityField;
}
set {
if ((object.ReferenceEquals(this.NationalityField, value) != true)) {
this.NationalityField = value;
this.RaisePropertyChanged("Nationality");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public bool NoMailMarketing {
get {
return this.NoMailMarketingField;
}
set {
if ((this.NoMailMarketingField.Equals(value) != true)) {
this.NoMailMarketingField = value;
this.RaisePropertyChanged("NoMailMarketing");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public System.Nullable<int> NoOfChildren {
get {
return this.NoOfChildrenField;
}
set {
if ((this.NoOfChildrenField.Equals(value) != true)) {
this.NoOfChildrenField = value;
this.RaisePropertyChanged("NoOfChildren");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public bool NoThirdPartyMarketing {
get {
return this.NoThirdPartyMarketingField;
}
set {
if ((this.NoThirdPartyMarketingField.Equals(value) != true)) {
this.NoThirdPartyMarketingField = value;
this.RaisePropertyChanged("NoThirdPartyMarketing");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem Occupation {
get {
return this.OccupationField;
}
set {
if ((object.ReferenceEquals(this.OccupationField, value) != true)) {
this.OccupationField = value;
this.RaisePropertyChanged("Occupation");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string PreviousName {
get {
return this.PreviousNameField;
}
set {
if ((object.ReferenceEquals(this.PreviousNameField, value) != true)) {
this.PreviousNameField = value;
this.RaisePropertyChanged("PreviousName");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public System.Nullable<System.DateTime> ReviewDate {
get {
return this.ReviewDateField;
}
set {
if ((this.ReviewDateField.Equals(value) != true)) {
this.ReviewDateField = value;
this.RaisePropertyChanged("ReviewDate");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem Status {
get {
return this.StatusField;
}
set {
if ((object.ReferenceEquals(this.StatusField, value) != true)) {
this.StatusField = value;
this.RaisePropertyChanged("Status");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem Title {
get {
return this.TitleField;
}
set {
if ((object.ReferenceEquals(this.TitleField, value) != true)) {
this.TitleField = value;
this.RaisePropertyChanged("Title");
}
}
}
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));
}
}
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="LookupItem", Namespace= + APIWEB)]
[System.SerializableAttribute()]
public partial class LookupItem : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
[System.NonSerializedAttribute()]
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string CodeField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string DisplayTextField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private bool IsActiveField;
[global::System.ComponentModel.BrowsableAttribute(false)]
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string Code {
get {
return this.CodeField;
}
set {
if ((object.ReferenceEquals(this.CodeField, value) != true)) {
this.CodeField = value;
this.RaisePropertyChanged("Code");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string DisplayText {
get {
return this.DisplayTextField;
}
set {
if ((object.ReferenceEquals(this.DisplayTextField, value) != true)) {
this.DisplayTextField = value;
this.RaisePropertyChanged("DisplayText");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public bool IsActive {
get {
return this.IsActiveField;
}
set {
if ((this.IsActiveField.Equals(value) != true)) {
this.IsActiveField = value;
this.RaisePropertyChanged("IsActive");
}
}
}
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));
}
}
}
That's cause purchaseOnHoldSetRequest.AdditionalDetail is an Array type (mostly, from your posted code) which you haven't initialized and trying to set an item in index 0 saying purchaseOnHoldSetRequest.AdditionalDetail[0].Description which will bound to throw NullRefException
Per your WSDL, the said property is array of AdditionalDetails class as seen below
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.ServiceReference2.AdditionalDetail[] AdditionalDetail {
get {
return this.AdditionalDetailField;
}
set {
if ((object.ReferenceEquals(this.AdditionalDetailField, value) != true)) {
this.AdditionalDetailField = value;
this.RaisePropertyChanged("AdditionalDetail");
}
}
}
Thus you need to initialize it first
purchaseOnHoldSetRequest.UserName = "username";
purchaseOnHoldSetRequest.Password = "password";
purchaseOnHoldSetRequest.SystemToken = "systemtoken";
purchaseOnHoldSetRequest.AgreementReference = customerAgreementNumberComboBox.Text;
purchaseOnHoldSetRequest.AdditionalDetail = new AdditionalDetail[3]; // here
And then access it likewise you are doing
purchaseOnHoldSetRequest.AdditionalDetail[0] = new AdditionalDetail();
purchaseOnHoldSetRequest.AdditionalDetail[0].Description = "1";

Getting new items added to an Observable Collection of a custom class

I have a set of classes that I am using to deserialize JSON into. My program will periodically look for changes to this JSON file, and if it finds any, will push the new data to the properties of these classes using reflection.
I need to find any new items added to the collection of the Item2 class (SocialExportJSON.SocialExportData.Item2) after a successful update.
My JSON classes look like this (there are more but I want to avoid too big a wall of code):
public class Item2 : INotifyPropertyChanged
{
[JsonProperty("type")]
private string type;
public string Type
{
get
{
return type;
}
set
{
if (type != value)
{
type = value;
RaisePropertyChanged("Type");
}
}
}
[JsonProperty("id")]
private string id;
public string ID
{
get
{
return id;
}
set
{
if (id != value)
{
id = value;
RaisePropertyChanged("ID");
}
}
}
[JsonProperty("postedIso8601")]
private string postedIso8601;
public string PostedIso8601
{
get
{
return postedIso8601;
}
set
{
if (postedIso8601 != value)
{
postedIso8601 = value;
RaisePropertyChanged("PostedIso8601");
}
}
}
[JsonProperty("postedTimestamp")]
private object postedTimestamp;
public object PostedTimestamp
{
get
{
return postedTimestamp;
}
set
{
if (postedTimestamp != value)
{
postedTimestamp = value;
RaisePropertyChanged("PostedTimestamp");
}
}
}
[JsonProperty("engagement")]
private Engagement engagement;
public Engagement Engagement
{
get
{
return engagement;
}
set
{
if (engagement != value)
{
engagement = value;
RaisePropertyChanged("Engagement");
}
}
}
[JsonProperty("source")]
private Source2 source;
public Source2 Source
{
get
{
return source;
}
set
{
if (source != value)
{
source = value;
RaisePropertyChanged("Source");
}
}
}
[JsonProperty("author")]
private Author author;
public Author Author
{
get
{
return author;
}
set
{
if (author != value)
{
author = value;
RaisePropertyChanged("Author");
}
}
}
[JsonProperty("content")]
private Content content;
public Content Content
{
get
{
return content;
}
set
{
if (content != value)
{
content = value;
RaisePropertyChanged("Content");
}
}
}
[JsonProperty("location")]
private Location location;
public Location Location
{
get
{
return location;
}
set
{
if (location != value)
{
location = value;
RaisePropertyChanged("Location");
}
}
}
[JsonProperty("publication")]
private Publication publication;
public Publication Publication
{
get
{
return publication;
}
set
{
if (publication != value)
{
publication = value;
RaisePropertyChanged("Publication");
}
}
}
[JsonProperty("metadata")]
private Metadata metadata;
public Metadata Metadata
{
get
{
return metadata;
}
set
{
if (metadata != value)
{
metadata = value;
RaisePropertyChanged("Metadata");
}
}
}
//Event handling
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string property)
{
//Console.WriteLine("Updated");
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
public class SocialExportData : INotifyPropertyChanged
{
[JsonProperty("dataType")]
private string dataType;
public string DataType
{
get
{
return dataType;
}
set
{
if (dataType != value)
{
dataType = value;
RaisePropertyChanged("DataType");
}
}
}
[JsonProperty("id")]
private int id;
public int ID
{
get
{
return id;
}
set
{
if (id != value)
{
id = value;
RaisePropertyChanged("ID");
}
}
}
[JsonProperty("story")]
private Story story;
public Story Story
{
get
{
return story;
}
set
{
if (story != value)
{
story = value;
RaisePropertyChanged("Story");
}
}
}
[JsonProperty("order")]
private string order;
public string Order
{
get
{
return order;
}
set
{
if (order != value)
{
order = value;
RaisePropertyChanged("Order");
}
}
}
[JsonProperty("lifetime")]
private string lifetime;
public string Lifetime
{
get
{
return lifetime;
}
set
{
if (lifetime != value)
{
lifetime = value;
RaisePropertyChanged("Lifetime");
}
}
}
[JsonProperty("maxAge")]
private int maxAge;
public int MaxAge
{
get
{
return maxAge;
}
set
{
if (maxAge != value)
{
maxAge = value;
RaisePropertyChanged("MaxAge");
}
}
}
[JsonProperty("maxSize")]
private int maxSize;
public int MaxSize
{
get
{
return maxSize;
}
set
{
if (maxSize != value)
{
maxSize = value;
RaisePropertyChanged("MaxSize");
}
}
}
[JsonProperty("consumeCount")]
private int consumeCount;
public int ConsumeCount
{
get
{
return consumeCount;
}
set
{
if (consumeCount != value)
{
consumeCount = value;
RaisePropertyChanged("ConsumeCount");
}
}
}
[JsonProperty("consumeInterval")]
private int consumeInterval;
public int ConsumeInterval
{
get
{
return consumeInterval;
}
set
{
if (consumeInterval != value)
{
consumeInterval = value;
RaisePropertyChanged("ConsumeInterval");
}
}
}
[JsonProperty("items")]
private ObservableCollection<Item2> items;
public ObservableCollection<Item2> Items
{
get
{
return items;
}
set
{
if (items != value)
{
items = value;
RaisePropertyChanged("Items");
}
}
}
//Event handling
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string property)
{
//Console.WriteLine("Updated");
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
public class SocialExportJSON : INotifyPropertyChanged
{
[JsonProperty("id")]
private string id;
public string ID
{
get
{
return id;
}
set
{
if (id != value)
{
id = value;
RaisePropertyChanged("ID");
}
}
}
[JsonProperty("ttl")]
private int ttl;
public int TTL
{
get
{
return ttl;
}
set
{
if (ttl != value)
{
ttl = value;
RaisePropertyChanged("TTL");
}
}
}
[JsonProperty("serial")]
private long serial;
public long Serial
{
get
{
return serial;
}
set
{
if (serial != value)
{
serial = value;
RaisePropertyChanged("Serial");
}
}
}
[JsonProperty("formatType")]
private string formatType;
public string FormatType
{
get
{
return formatType;
}
set
{
if (formatType != value)
{
formatType = value;
RaisePropertyChanged("FormatType");
}
}
}
[JsonProperty("modifiedIso8601")]
private string modifiedIso8601;
public string ModifiedIso8601
{
get
{
return modifiedIso8601;
}
set
{
if (modifiedIso8601 != value)
{
modifiedIso8601 = value;
RaisePropertyChanged("ModifiedIso8601");
}
}
}
[JsonProperty("modifiedTimestamp")]
private long modifiedTimestamp;
public long ModifiedTimestamp
{
get
{
return modifiedTimestamp;
}
set
{
if (modifiedTimestamp != value)
{
modifiedTimestamp = value;
RaisePropertyChanged("ModifiedTimestamp");
}
}
}
[JsonProperty("timezone")]
private string timezone;
public string Timezone
{
get
{
return timezone;
}
set
{
if (timezone != value)
{
timezone = value;
RaisePropertyChanged("Timezone");
}
}
}
[JsonProperty("dataType")]
private string dataType;
public string DataType
{
get
{
return dataType;
}
set
{
if (dataType != value)
{
dataType = value;
RaisePropertyChanged("DataType");
}
}
}
[JsonProperty("exports")]
private ObservableCollection<SocialExportData> exports;
public ObservableCollection<SocialExportData> Exports
{
get
{
return exports;
}
set
{
if (exports != value)
{
exports = value;
RaisePropertyChanged("Exports");
}
}
}
//Event handling
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string property)
{
//Console.WriteLine("Updated");
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
In another class, I have a method to deserialize to a global instance of my JSON class. It looks like this:
public SocialExportJSON socialExportData;
private async void DownloadAndDeserializeJSONAsync()
{
try
{
//Create a web client with the supplied credentials
var exportClient = new WebClient { Credentials = new NetworkCredential(uName, pw), Encoding = Encoding.UTF8};
//Create a task to download the JSON string and wait for it to finish
var downloadTask = Task.Run(() => exportClient.DownloadString(new Uri(eURL)));
downloadTask.Wait();
//Get the string from the task
var JSONString = await downloadTask;
//Create a task to deserialize the JSON from the last task
var DeserializeTask = Task.Run(() => JsonConvert.DeserializeObject<SocialExportJSON>(JSONString));
DeserializeTask.Wait();
SocialExportJSON sej = await DeserializeTask;
//Check the timestamp first to see if we should change the data
if(socialExportData == null)
{
//Get the data from the task
socialExportData = await DeserializeTask;
}
else if(sej.ModifiedTimestamp != socialExportData.ModifiedTimestamp)
{
//Get the data from the task
SocialExportJSON newData = await DeserializeTask;
GetNewItems(newData);
SetNewData(newData);
//Call the exportUpdated event when the task has finished
exportUpdated();
}
}
catch (Exception e)
{
MessageBox.Show(e.Message.ToString());
}
}
In my SetNewData function, shown below, I use reflection to set the properties of my global class. Because I'm setting the whole collection rather than iterating through each of the properties in each of the classes, I can't use the CollectionChanged event to find new items.
public void SetNewData(SocialExportJSON newData)
{
//Loop through each of the properties and copy from source to target
foreach (PropertyInfo pi in socialExportData.GetType().GetProperties())
{
if (pi.CanWrite)
{
pi.SetValue(socialExportData, pi.GetValue(newData, null), null);
}
}
}
Is there a way I can modify my SetNewData function in such a way that it calls CollectionChanged? If not, what would be the best way to go about getting any new additions to my collection of Item2?
In my Main function. I create an instance of my class called SocialExport like so:
SocialExport s = new SocialExport("http://example.json", "example", "example");.
This class is where the global instance of my JSON class is contained, and my event handler is added like so
s.socialExportData.Exports[0].Items.CollectionChanged += CollectionChanged;
Then you are hooking up an event handler for the CollectionChanged event for that particular instance of ObservableCollection<Item2>.
If you create a new ObservableCollection<Item2>, you obviously must hook up an event handler to this one as well. The event handler that is associated with the old object won't be invoked when new items are added to the new instance.
So whenever a new ObservableCollection<Item2> is created, using deserialization or not, you should hook up a new event handler.
You could probably do this in your DownloadAndDeserializeJSONAsync method. The other option would be to create only one instance of the collection and remove and add items from/to this one.

Sharing Data contract class among different services

I have this data contract class as a separate dll in my WCF server code:
namespace Engine.V100.SharedDataContract
{
#region Authorization
[DataContract(Namespace = "Engine.V100.SharedDataContract")]
[Serializable]
public class Identity
{
[DataMember]
public string UserName;
[DataMember]
public Guid UserID;
[DataMember]
public string PassWord;
[DataMember]
public Guid GroupCode;
}
#endregion
}
I referenced the same dll in client side code and I selected the option of "Reuse types in all referenced assemblies." But type Identity is still defined by each service reference separately and I have problem of conflicting assemblies.
This is the sample of what client side service reference generates:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="Identity", Namespace="http://tempuri.org/")]
[System.SerializableAttribute()]
public partial class Identity : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
[System.NonSerializedAttribute()]
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string UserNameField;
private System.Guid UserIDField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string PassWordField;
private System.Guid GroupCodeField;
[global::System.ComponentModel.BrowsableAttribute(false)]
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
public string UserName {
get {
return this.UserNameField;
}
set {
if ((object.ReferenceEquals(this.UserNameField, value) != true)) {
this.UserNameField = value;
this.RaisePropertyChanged("UserName");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute(IsRequired=true, Order=1)]
public System.Guid UserID {
get {
return this.UserIDField;
}
set {
if ((this.UserIDField.Equals(value) != true)) {
this.UserIDField = value;
this.RaisePropertyChanged("UserID");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=2)]
public string PassWord {
get {
return this.PassWordField;
}
set {
if ((object.ReferenceEquals(this.PassWordField, value) != true)) {
this.PassWordField = value;
this.RaisePropertyChanged("PassWord");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute(IsRequired=true, Order=3)]
public System.Guid GroupCode {
get {
return this.GroupCodeField;
}
set {
if ((this.GroupCodeField.Equals(value) != true)) {
this.GroupCodeField = value;
this.RaisePropertyChanged("GroupCode");
}
}
}
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));
}
}
}
It may be considerable that referened type namespace is tempuri.
Please help

Categories

Resources