Ich habe ein oder zwei Beiträge zu diesem Thema gesehen, aber keine der Lösungen, die für diese Fragen funktionierten, funktionierte für mich, also werde ich hier fragen.Angular 2 & .NET Core Web API HttpPost Problem
Ich habe eine angular 2 (2.4) App, die eine .netCore (1.0) Web API aufruft.
Meine Get-Anfragen an die Web-API funktionieren gut. Meine Web-API erlaubt alle Methoden (es schränkt die Herkunft ein, aber weil das funktioniert, habe ich den Eindruck, dass das nicht das Problem ist).
Meine Anfrage wird an die API gesendet, aber der Anforderungsinhalt wird nicht in das Parameterobjekt deserialisiert. Der Parameter auf dem Webapi ist immer Null.
Zur Zeit meiner Web-API-Methode ist (zu Testzwecken):
[HttpPost]
public Member Post([FromBody] DocMe.Model.Provider.Member member)
{
return member;
}
Meine Anfrage sieht wie folgt aus:
Mein Code, um die Anfrage zu erzeugen, aus Angular ist:
public post(url: string, data: any): Observable<Response> {
this.headers = new Headers();
this.headers.append('Content-Type', 'application/json');
this.headers.append('Accept', 'application/json');
let token = this.authService.GetToken();
if (token !== '') {
this.headers.append('Authorization', 'Bearer ' + token);
}
return this.http.post(url, JSON.stringify(data), { headers: this.headers });
}
Die Anfrage Payload in den Devtools ima ge stellt genau den Inhalt des Datenobjekts dar, das an die Methode übergeben wurde.
Wenn ich die Methode debuggen, sehe ich, dass der Aufruf über die Signatur, aber mit dem Parameter "member" = null erhalten. Die Anforderungsnutzdaten stimmen mit den Eigenschaften des Membertyps überein (Ausnahme ist, dass die Payload camelCase ist, während der Membertyp PascalCase ist).
Meine POCO Definition lautet:
public class Member
{
public Member()
{
this.Id = Guid.NewGuid();
this.MemberTypeId = 1;
this.Deleted = false;
this.MemberPractices = new HashSet<MemberPractice>();
this.Educations = new HashSet<Education>();
this.Insurances = new HashSet<Insurance>();
this.Languages = new HashSet<Language>();
this.Specialties = new HashSet<Specialty>();
this.WorkHours = new HashSet<WorkHour>();
this.WorkHoursOverrides = new HashSet<WorkHoursOverride>();
}
[Key]
[Display(Name = "Id")]
public Guid Id { get; set; } // uniqueidentifier, not null
[Display(Name = "Member Type Id")]
public int MemberTypeId { get; set; } // int, not null
[MaxLength(50)]
[StringLength(50)]
[Display(Name = "NPI")]
public string NPI { get; set; } // varchar(50), null
[MaxLength(100)]
[StringLength(100)]
[Display(Name = "First Name")]
public string FirstName { get; set; } // nvarchar(100), null
[MaxLength(100)]
[StringLength(100)]
[Display(Name = "Last Name")]
public string LastName { get; set; } // nvarchar(100), null
[MaxLength(256)]
[StringLength(256)]
[Display(Name = "Contact Email")]
public string ContactEmail { get; set; } // nvarchar(256), null
[MaxLength(10)]
[StringLength(10)]
[Display(Name = "Gender")]
public string Gender { get; set; } // varchar(10), null
[MaxLength]
[Display(Name = "Biography")]
public string Biography { get; set; } // varchar(max), null
[MaxLength(450)]
[StringLength(450)]
[Display(Name = "Identity Id")]
public string IdentityId { get; set; } // nvarchar(450), null
[Display(Name = "Deleted")]
public bool Deleted { get; set; } // bit, not null
[Display(Name = "Deleted Date")]
public DateTime? DeletedDate { get; set; } // datetime, null
[Display(Name = "Deleted By")]
public Guid? DeletedBy { get; set; } // uniqueidentifier, null
[ForeignKey("Id")]
public LkupMemberType LkupMemberType { get; set; }
public ICollection<MemberPractice> MemberPractices { get; set; }
public ICollection<Education> Educations { get; set; }
public ICollection<Insurance> Insurances { get; set; }
public ICollection<Language> Languages { get; set; }
public ICollection<Specialty> Specialties { get; set; }
public ICollection<WorkHour> WorkHours { get; set; }
public ICollection<WorkHoursOverride> WorkHoursOverrides { get; set; }
}
My Front-End-Modell, das für die Befüllung des Request Payload verantwortlich ist:
export class ProviderModel {
public id: string;
public npi: string;
public firstName: string;
public lastName: string;
public contactEmail: string;
public gender: string;
public biography: string;
public specialties: SpecialityModel[];
public educations: EducationModel[];
public insurances: InsuranceModel[];
public languages: LanguageModel[];
constructor() {
this.id = null;
this.specialties = [];
this.educations = [];
this.insurances = [];
this.languages = [];
}
}
Bedenkt man, wie neue .net Kern ist, ich bin nicht sicher wenn ich etwas falsch mache oder wenn es einen Fehler gibt, über den ich gestolpert bin.
Ich habe dieses Problem seit ein paar Tagen angestarrt, also wollte ich das hier veröffentlichen, um meine geistige Gesundheit zu testen und hoffentlich gelöst zu haben, damit ich von etwas weggehen kann, das relativ trivial sein sollte.
wo ist der Code? – Aravind
Mein erster Verdacht ist, dass JSON Serialisierungseinstellungen ... – Adil
können Sie auch Ihre POCO einfügen (Member-Klasse) – Adil