c#
  • iphone
  • objective-c
  • xml
  • wcf
  • 2011-05-16 155 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所說,默認是按字母順序的,但您可以指定一個訂單。你的不是按字母順序排列的,所以我希望你有服務器端序列化問題。

    我建議你登錄發生了什麼服務器端。請求是否在您的服務中正確反序列化?這會告訴你數據在哪裏丟失。

    相關問題