Отправка в службу WCF с отправкой значений NULL - PullRequest
1 голос
/ 17 мая 2011

Я пытаюсь отправить сообщение в службу WCF из приложения для iPhone. У меня есть приложение, отправляющее в сервис и пытающееся отправить данные в виде контракта на сервисные данные в XML, как показано ниже:

NSData *myPostData = [[NSString stringWithFormat:@"<AddMediaItem xmlns='http://www.example.com'><Item xmlns:a='http://www.example.com/MediaItem'><a:MediaType>iPhone</a:MediaType><a:Description>Description</a:Description><a:Name>Test</a:Name><a:ImageType>JPEG</a:ImageType></Item></AddMediaItem>"] dataUsingEncoding:NSUTF8StringEncoding];

NSMutableData *myMutablePostData = [NSMutableData dataWithData:myPostData];

[request setPostBody:myMutablePostData];  
[request setRequestMethod:@"POST"];  
[request addRequestHeader:@"Content-Type" value:@"application/xml"];  

[request setDidFinishSelector:@selector(uploadFinished:)];
[request setDidFailSelector:@selector(uploadFailed:)];
[request setDelegate:self];
[request startAsynchronous];

В целях тестирования я настроил свой сервис на возврат контракта на данные, который я отправил в сервис. Однако, когда он возвращается, некоторые значения кажутся NULL, хотя из приведенного выше кода я даю им значения.

Что также кажется странным, так это то, что элемент данных Name всегда имеет значение, но остальные 3, которые я отправляю, возвращают NULL или с правильными значениями, основанными на порядке их появления в XML, который я публикую в службе.

Ниже приведен код моего контракта на обслуживание:

[ServiceContract(Namespace = "http://www.example.com")]
public interface IImageDiaryService
{

    [OperationContract]
    [WebInvoke(UriTemplate = "AddMediaItem", Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
    MediaItem AddMediaItem(MediaItem Item);

}

Ниже приведен код моего контракта с данными MediaItem:

[DataContract(Namespace = "http://www.example.com/MediaItem")]
public class MediaItem
{

    [DataMember]
    public Int32 Id { get; set; }

    [DataMember]
    public String Name { get; set; }

    [DataMember]
    public String Description { get; set; }

    [DataMember]
    public String ImageData { get; set; }

    [DataMember]
    public String ImageType { get; set; }

    [DataMember]
    public String MediaType { get; set; }

}

Дайте мне знать, если вам нужен еще какой-нибудь код.

Любая помощь очень ценится.

Ответы [ 2 ]

5 голосов
/ 17 мая 2011

Порядок важен в контрактах данных - по умолчанию элементы данных располагаются в алфавитном порядке, но вы можете переопределить его, используя свойство Order [DataMember]. Попробуйте изменить порядок полей, и вы получите правильные значения

<AddMediaItem xmlns='http://www.example.com'>
  <Item xmlns:a='http://www.example.com/MediaItem'>
    <a:Description>Description</a:Description>
    <a:ImageType>JPEG</a:ImageType>
    <a:MediaType>iPhone</a:MediaType>
    <a:Name>Test</a:Name>
  </Item>
</AddMediaItem>
0 голосов
/ 17 мая 2011

DataContractSerializer только десериализуется в известном порядке. Как говорит carlosfigueira, по умолчанию используется алфавитный порядок, но вы можете указать порядок. У вас нет алфавита, поэтому я ожидаю, что у вас проблемы с сериализацией на стороне сервера.

Я бы предложил вам записать, что происходит на стороне сервера. Правильно ли десериализуется запрос внутри вашего сервиса? Это скажет вам, где данные пропадают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...