发布到发送 NULL 值的 WCF 服务

本文关键字:WCF 服务 值的 NULL | 更新日期: 2023-09-27 17:56:31

我正在尝试从iPhone应用程序发布到我的WCF服务。我已将应用程序发布到服务,并尝试以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; }
}

如果您需要任何进一步的代码,请告诉我。

任何帮助都非常感谢。

发布到发送 NULL 值的 WCF 服务

顺序在数据协定中很重要 - 默认情况下,数据成员按字母顺序排序,但您可以使用 [DataMember] 的 Order 属性重写它。尝试对字段重新排序,您将获得正确填充的值

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

DataContractSerializer 按已知顺序反序列化。正如Carlosfigueira所说,默认值是按字母顺序排列的,但您可以指定顺序。你的不是按字母顺序排列的,所以我希望你遇到服务器端序列化问题。

我建议您记录服务器端发生的事情。请求是否在服务中正确反序列化?这将告诉您数据丢失的位置。