2016-09-14 3 views
0

По какой-то причине мой объект AttributeContract не передается от моего клиента к моему методу обслуживания правильно. Я могу успешно получить доступ к методу через вызов, но объект пуст. Любые предложения о том, что я делаю неправильно здесь?WCF REST Post Complex Object

Client

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

Метод Service

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

ответ

0

Ваш метод не соответствует: по контракту услуг набирается, как PUT, но на клиенте это POST. Также имя вашего объекта не соответствует: attribute =! AttributeContract

+0

Да - метод был ошибкой, которая с тех пор была исправлена ​​и с тем же результатом. Какие имена объектов должны быть одинаковыми. Имя объекта в JSON и Сервисный контракт, Сервисный метод ...? Я пробовал несколько различных соглашений об именах, поскольку это, по-видимому, самая очевидная проблема. – crowemi

+0

Не важно, не используйте имя объекта или имя переменной метода. Только отправьте свойства: {AttributeId: 1, Attribute: "ss"} – mkysoft

+0

Сначала сделайте свой сервисный тест с помощью инструментов, а не кода C#. Например, браузер Chrome имеет расширение, которое лучше всего подходит для Postman. – 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(); 
        } 

Попробуйте этот код

+0

Я надеялся сделать все, используя HttpClient. Тем не менее, я рассматриваю это и потенциально переключаюсь на WebRequest/WebResponse. – crowemi

+0

Я помню, что у меня также была проблема с httpclient, и я использовал этот способ –

+0

Когда вы это сделали, вы смогли десериализовать JSON в объект со стороны сервиса и получить доступ к его членам? – crowemi

0

Оказывается, вам не нужен объект обертку в JSON (в mkysoft). Небольшой рытье в fiddler показало, что у меня возникли проблемы десериализации свойства datetime в моем контракте на данные. Я изменил свойство с DateTime на строку, пока я определяю лучший путь вперед.