2017-02-25 16 views
0

私はこの同じトピック上の1つのまたは2つのポストを見てきましたが、これらの質問のために働いどちらソリューションはので、私はここにお願いするつもりです私のために働きました。角度2&.NETのコアウェブAPI HttpPost問題

私は.netCore(1.0)のWeb APIを呼び出して、角度2(2.4)アプリを持っています。

私のWeb APIへのリクエストはうまく動作します。私のWeb APIはすべてのメソッドを許可しています(起源を制限しますが、getが機能するため、問題ではないという印象を受けています)。

私の要求がAPIになりますが、要求内容は、パラメータオブジェクトにデシリアライズされていません。 webapiのパラメータは常にnullです。

現在、私のWeb APIメソッドは、(テスト目的のために)です:

[HttpPost]   
    public Member Post([FromBody] DocMe.Model.Provider.Member member) 
    { 
     return member; 
    } 

私の要求は、次のようになります。

enter image description here

角度からの要求を生成するために私のコードは次のとおりです。

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

デベロッパーツールIMAでの要求ペイロードgeは、メソッドに渡されるデータオブジェクトの内容を正確に表します。

私はこの方法をデバッグするとき、私は電話を見るには、署名を過ぎたが、「メンバー」パラメータ= nullを取得します。リクエストペイロードはメンバータイプのプロパティと一致します(ただし、ペイロードはcamelCase、メンバータイプはPascalCase)。

マイPOCO定義は次のとおりです。要求ペイロードを充填するための責任がある

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

私のフロントエンドモデルは次のとおりです。

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 = []; 
} 
} 

新しい.NETコアがどのように考えると、私はわからないんだけどもし私が何か間違っている、あるいは私が遭遇したかもしれない何らかのバグがあるならば。

私はこの問題を数日前から見つめていましたので、私はこの問題をテストして解決してほしいと思っていました。

+0

コードはありますか? – Aravind

+0

私の最初の容疑者は、JSONのシリアル化設定です... – Adil

+0

POCOも貼り付けられますか(メンバークラス) – Adil

答えて

1

更新:HashSetが問題であると思われます。 HashSet用に独自のJsonConverterを作成することを検討してください。

======

あなたはキャメルケースを解決するには、Web APIのSerializerSettingsを構成していますか?

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

私はもともとDefaultContractResolver()に割り当てていました。 CamelCasePropertyNamesContractResolverに変更して、それがうまくいくかどうかを確認しました。同じ問題があります。 – JakeHova

+0

オブジェクトのリストを処理するためのより良い方法がありますので、それらのカスタムコンバータを記述する必要はありませんか? HashSetの代わりにList型を使用するとうまくいくのでしょうか? – JakeHova

+0

私の期待は、リストは箱詰めで動くはずです...しかし、あなたはHashSetの機能を持たないでしょう。 Listが十分あれば、HashSetを取り除くことを検討することができます。この投稿はあなたを助けるかもしれません:http://stackoverflow.com/questions/28672082/asp-net-entity-framework-6-hashset-or-list-for-a-collection – Adil