c#
  • iphone
  • objective-c
  • xml
  • wcf
  • 2011-05-16 159 views 1 likes 
    1

    我想从iPhone应用程序发布到我的WCF服务。我有应用程序发布到服务,并试图在服务合同数据的形式发送数据以XML象下面这样:发布到WCF服务发送空值

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

    做让我知道如果你需要任何进一步的代码。

    任何帮助,非常感谢。

    +0

    您是否尝试过更改MediaItem不使用自动属性(例如,将属性存储值设置并获取到本地变量)。 – Oppositional 2011-05-16 22:47:37

    +0

    你可以设置一个常规的胜利形式或控制台应用程序,并尝试一下。你会得到什么结果?什么是通过电线发送的数据,使用提琴手检查出来。有可能你的反序列化不能正常工作。也许命名空间问题或XML问题。 – 2011-05-16 22:56:30

    +0

    你在打什么网址?应该是http://domain.com/AddMediaItem我认为你的XML是错误的,因为你试图传递方法名称,就好像它是一个SOAP消息。这不会反序列化成MediaItem类型。为了验证这一点,在AddMediaItem方法 – 2011-05-16 22:57:41

    回答

    5

    的顺序就是数据契约重要 - 默认的数据成员按字母顺序排列,但您可以通过使用[数据成员] 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> 
    
    +0

    +1内设置了一个断点,我忘记了这一点。你是对的。订单很重要。 – 2011-05-16 23:58:43

    +0

    啊哈,这让它工作。我不认为我会得出这个结论。非常感谢你的帮助! – 2011-05-17 17:48:35

    0

    填充DataContractSerializer的在已知的顺序反序列化。正如carlosfigueira所说,默认是按字母顺序的,但您可以指定一个订单。你的不是按字母顺序排列的,所以我希望你有服务器端序列化问题。

    我建议你登录发生了什么服务器端。请求是否在您的服务中正确反序列化?这会告诉你数据在哪里丢失。

    相关问题