2016-09-14 25 views
0

何らかの理由で、私のAttributeContractオブジェクトがクライアントからサービスメソッドに正しく渡されていません。呼び出しによってメソッドに正常にアクセスできますが、オブジェクトは空です。私がここで間違っていることに関する提案はありますか?WCF REST投稿複合オブジェクト

クライアント

using (var client = new HttpClient()) 
{ 
    string serviceCall = string.Format("{0}AttributeService.svc/AttributeDefinition/", _serviceLocation); 

    int attributeIdInt = Convert.ToInt32(attributeId); 
    int objectIdInt = Convert.ToInt32(objectId); 

    AttributeContract attributeContract = new AttributeContract() 
    { 
     AttributeId = attributeIdInt, 
     AttributeValue = attributeValue, 
     ObjectId = objectIdInt, 
     ObjectType = objectType 
    }; 

    string attributeString = JsonConvert.SerializeObject(attributeContract); 
    string requestJsonString = "{ \"attribute\" : " + attributeString + " }"; 

    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, serviceCall); 
    request.Content = new StringContent(requestJsonString, Encoding.UTF8, "application/json"); 

    HttpResponseMessage response = client.SendAsync(request).Result; 

} 

データ契約

[DataContract(Name = "AttributeContract")] 
public class AttributeContract 
{ 
    [DataMember(Name = "AttributeId")] 
    public int AttributeId { get; set; } 

    [DataMember(Name = "Attribute")] 
    public string Attribute { get; set; } 

    [DataMember(Name = "AttributeValue")] 
    public string AttributeValue { get; set; } 

    [DataMember(Name = "ObjectId")] 
    public int ObjectId { get; set; } 

    [DataMember(Name = "ObjectType")] 
    public string ObjectType { get; set; } 

    [DataMember(Name = "LastModifiedDate")] 
    public DateTime LastModifiedDate { get; set; } 

    [DataMember(Name = "LastModifiedUser")] 
    public string LastModifiedUser { get; set; } 
} 

サービス契約

[OperationContract] 
[WebInvoke(Method = "PUT", 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json, 
    UriTemplate = "AttributeDefinition/")] 
void UpdateAttributes(AttributeContract attribute); 

サービスメソッド

[OperationBehavior(TransactionScopeRequired = true)] 
public void UpdateAttributes(AttributeContract attribute) 
{ 
    attribute.LastModifiedDate = DateTime.Now;  
} 

答えて

0

あなたの方法は一致しません:それはPUTとして入力されますが、クライアント上で、それはPOSTでサービス契約に。またあなたのオブジェクト名は一致しません:属性=!

+0

はい - 方法は間違いであったため、修正されて同じ結果が得られました。 同一である必要があるオブジェクト名はどれですか。 JSON内のオブジェクト名とサービス契約、サービスメソッド...? これは最も明白な問題であると思われるいくつかの異なる命名規則を試しました。 – crowemi

+0

オブジェクト名やメソッド変数名は使用しないでください。プロパティのみを送信する:{AttributeId:1、Attribute: "ss"} – mkysoft

+0

まず、C#コードではなくツールを使用してサービステストを行います。たとえば、クロムブラウザには、名前が郵便番号の拡張子があります。 – mkysoft

0
string serviceCall = string.Format("{0}AttributeService.svc/AttributeDefinition/", _serviceLocation); 

    int attributeIdInt = Convert.ToInt32(attributeId); 
    int objectIdInt = Convert.ToInt32(objectId); 

    AttributeContract attributeContract = new AttributeContract() 
    { 
     AttributeId = attributeIdInt, 
     AttributeValue = attributeValue, 
     ObjectId = objectIdInt, 
     ObjectType = objectType 
    }; 

        var request = 
         (HttpWebRequest) 
          WebRequest.Create(new Uri(serviceCall); 
        request.ContentType = "application/json"; 
        request.Method = "PUT"; 
        var itemToSend = JsonConvert.SerializeObject(
         attributeContract 
         ); 
        using (var streamWriter = new StreamWriter(await request.GetRequestStreamAsync())) 
        { 
         streamWriter.Write(itemToSend); 
         streamWriter.Flush(); 
         streamWriter.Dispose(); 
        } 

AttributeContract

+0

私はHttpClientを使ってすべてをやりたいと思っていました。しかし、私はこれを見直しており、潜在的にWebRequest/WebResponseに切り替える予定です。 – crowemi

+0

私はhttpclientにも問題があったことを覚えています。このように使用しました。 –

+0

これを実行すると、JSONをサービス側のオブジェクトにデシリアライズしてメンバにアクセスできましたか? – crowemi

0

は、あなたが(mkysoftあたり)JSONでのオブジェクトラッパーを必要としないが判明し、このコードを試してみてください。 fiddlerで少し掘り下げて、データ契約のdatetimeプロパティをデシリアライズする際に問題が発生していることが明らかになりました。私は、最善のパスを決定する間、プロパティをDateTimeからstringに変更しました。

関連する問題