2017-02-25 9 views
0

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:

enter image description here

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.

+0

wo ist der Code? – Aravind

+0

Mein erster Verdacht ist, dass JSON Serialisierungseinstellungen ... – Adil

+0

können Sie auch Ihre POCO einfügen (Member-Klasse) – Adil

Antwort

1

Update: Ich vermute, HashSet ist das Problem. Erwäge, deinen eigenen JsonConverter für HashSet zu schreiben.

======

Haben Sie SerializerSettings für Ihre Web-APIs konfiguriert Camel Gehäuse zu lösen?

services.AddMvc().AddJsonOptions(options => 
        { 
         options.SerializerSettings.ContractResolver = 
          new CamelCasePropertyNamesContractResolver(); 
        }); 
+0

Ich hatte es ursprünglich der DefaultContractResolver() zugeordnet. Ich habe es in CamelCasePropertyNamesContractResolver geändert, nur um zu sehen, ob das funktioniert und ich habe das gleiche Problem. – JakeHova

+0

Gibt es eine bessere Möglichkeit, Listen von eingehenden Objekten zu bearbeiten, so dass ich keinen benutzerdefinierten Konverter für sie schreiben muss? Könnte die Verwendung eines List-Typs anstelle eines HashSets besser funktionieren? – JakeHova

+0

Ich erwarte, dass List out of box funktioniert ...Aber dann haben Sie keine HashSet-Funktionalität. Wenn List gut genug für Sie ist, dann sollten Sie vielleicht HashSet loswerden. Dieser Beitrag kann Ihnen helfen: http://stackoverflow.com/questions/28672082/asp-net-entity-framework-6-hashset-or-list-for-a-collection – Adil