2013-05-15 29 views
1

我在WCF應用程序的工作,我調用這個操作JSON解析錯誤WCF

[ServiceContract] 
public interface IAuditDataService 
{ 

    [OperationContract(Name = "UserAuthentication")] 
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest, UriTemplate = "/UserAuthentication?username={username}")] 
    string UserAuthentication(string username, UserData userInfo); 

} 

我收到錯誤

"Object Reference not set to an instance" 

這裏

public string UserAuthentication(string username, UserData userInfo) 
{ 
    string outputData = string.Empty; 
    return userInfo.ToString(); // << Error at this line 
} 

這裏是JSON類

[DataContract] 
[Serializable()] 
public class UserData 
{ 
    [DataMember(Name = "UserName", Order = 1)] 
    public string UserName { get; set; } 

    [DataMember(Name = "Password", Order = 2)] 
    public string Password { get; set; } 

    [DataMember(Name = "Token", Order = 3)] 
    public string Token { get; set; } 
} 

這裏是通過POST方法JSON請求

{"UserName":"abcd", 
"Password":"1234", 
"Token":"1234"} 

這裏是響應截屏enter image description here

任何幫助!

+0

userInfo爲空。你從哪裏得到這個價值? –

+0

我已編輯它,請檢查它。 – Ahmed

回答

4

[WebInvoke]屬性的BodyStyle屬性指定的樣式是WrappedRequest - 這意味着要作爲輸入傳遞必須對象中的對象,其成員的名字作爲屬性名相同的包裹,正如史蒂夫威爾克斯所說。

另一種選擇是將BodyStyle更改爲Bare;在這種情況下,你的輸入應該可以正常工作。換句話說,如果這是您的操作聲明,那麼您的問題中的輸入應該可以工作。

[OperationContract(Name = "UserAuthentication")] 
[WebInvoke(Method = "POST", 
      ResponseFormat = WebMessageFormat.Json, 
      BodyStyle = WebMessageBodyStyle.Bare, 
      UriTemplate = "/UserAuthentication?username={username}")] 
string UserAuthentication(string username, UserData userInfo); 
+0

偉大的你是超人。謝謝 – Ahmed

1

我沒有測試過這一點,但你不應該張貼:

{ 
    username: "abcd" 
    userInfo: { 
     "UserName": "abcd", 
     "Password": "1234", 
     "Token": "1234" 
    } 
} 

...?

+3

他正在從請求url獲取'username'。檢查'UriTemplate'。因此,只有您的解決方案的{{userInfo:{...}}應該這樣做。 –

+0

仍然有相同的問題。這是給我錯誤的請求錯誤,這是由於「對象引用未設置爲實例」 – Ahmed

+0

我的不好的用戶名 - 感謝指出 - 我懶得滾動:) –