2013-01-24 151 views
2

在我的情況WCF RESTful服務,我有如下一個Web服務,不接受JSON輸入

[OperationContract] 
    [WebInvoke(UriTemplate = "services/CreatePerson", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST")] 
    string CreatePerson(string data); 

它期待一個JSON輸入。雖然我通過傳遞一個JSON字符串作爲請求的身體下面,

"{"personName":"Joe", "source":"I", "address":"KK Road"}" 

測試使用Fiddler此服務,並請求頭作爲

User-Agent: Fiddler 
Content-Type: application/json;charset=utf-8 
Host: localhost 
Content-Length: 54 

它不打的服務方法斷點調試時。

同時其工作以下JSON如下(用單引號之前的JSON代替雙引號),

"{'personName':'102', 'source':'I', 'address':'KK Road'}" 

服務方法不採取JSON字符串輸入,因爲它工作得很好,如果我通過輸入如「測試」 ..

哪裏是實際的問題,請幫我找出....

+0

那麼,將雙引號更改爲單引號後會出現什麼問題?你也可以直接將json對象映射到你的方法參數,如果你傳入這樣一個對象:{「data」:「somevalue」} – Jomit

+0

「{'personName':'102','source':'I','地址':'KK Road'}「輸入正在工作,但是在消費者和服務端管理這個輸入相當無禮,因爲android和iphone應用程序所使用的服務應該通過將雙引號替換爲單引號來重寫代碼(如獲取json字符串時,使用雙引號將他們的類序列化爲json)以及我需要將其替換爲雙引號以反序列化到相應類的服務。 –

+0

好的。那麼爲什麼你需要在一個參數中傳遞數據呢?我的意思是對於上面的例子,你可以用3個參數創建服務方法。然後從iPhone或Android客戶端,您可以創建一個常規對象,將其序列化爲JSON並將其傳遞給服務。只要對象具有相同的參數名稱,WCF就會適當地映射它。 – Jomit

回答

1

我不認爲你應該使用的初始和結尾的引號!

嘗試:

{'personName':'102', 'source':'I', 'address':'KK Road'} 

而且你的方法不應該有一個字符串參數,但符合json的一類。

public class M 
{ 
    public string personName { get; set; } 
    public string source { get; set; } 
    public string address { get; set; } 
} 

[OperationContract] 
[WebInvoke(UriTemplate = "services/CreatePerson", RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json, Method = "POST")] 
string CreatePerson(M data); 
+0

謝謝Rechard,我也嘗試過,但它仍然沒有達到服務方法。如果我將json輸入作爲{「M」:{「personId」:「102」,「source」:「I」,「allergen」:「dust」}}傳遞給服務方法,但是在服務中全部M類的屬性爲null(personId,source,address爲null) –

+0

我假設你正在從Fiddler開始POST。 Fiddler報告的迴應是什麼? –

+0

是的,我正在使用實體框架。它已經生成了一個名爲'Person'的實體,它具有我們在json輸入中定義的所有屬性。當我將服務方法的類型更改爲'Person'並傳遞json輸入as {「personName」:「Joe」,「source」:「I」,「address」:「KK Road」,「createdDate」:「2012年12月12日」}在服務方法中,調試。現在我已經創建了一個名爲'PersonData'的單獨的類以及由實體框架生成的相同屬性,它的工作完美無缺... –