2010-06-30 166 views
7

無法讓我的JQuery POST被WCF服務接受。下面是從JavaScript中的POST:400通過JQuery使用WCF POST的錯誤請求HTTP響應

function jqueryPost() { 
    var url = "/LoggingTest"; 
    $.post(url, { message: "test message" }); 
} 

這是我如何接受POST,通過一個接口:

[OperationContract] 
[WebInvoke(Method = "POST", 
      UriTemplate = "/LoggingTest", 
      BodyStyle = WebMessageBodyStyle.Bare)] 
void LoggingTest(string message); 

和實現:

public void LoggingTest(string message) 
{ 
    log.Debug(message, null); 
} 

當我打電話函數jqueryPost我在網絡檢查員看到一個HTTP響應400錯誤請求。不知道如何讓POST請求工作。

(由7/1)
@詹姆斯,這裏是從網上督察輸出:

http://localhost:4252/LoggingTest HTTP信息
請求方法:POST
狀態代碼:400錯誤的請求
請求頭
接受:/
緩存控制:max-age = 0
內容類型:應用/ X WWW的窗體-urlencoded
產地:http://localhost:4252
的Referer:
的User-Agent:Mozilla的/ 5.0(視窗; U; Windows NT 5.1; Ç - )爲AppleWebKit/532.4(KHTML,例如Gecko)QT/4.6.2 Safari瀏覽器/ 532.4
X-請求-隨着:XMLHttpRequest的
表單數據
消息:測試消息
響應頭
內容長度:1165
的Content-Type:text/html的
日期:星期四,2010年7月1日18時56分15秒GMT
服務器:HTTPAPI/1.0

+0

你可以使用Fiddler(或者其他的東西)併發布完整的請求/響應嗎?我想知道它是否發佈到一個不正確的網址(例如取決於是否部署到根目錄) – 2010-06-30 05:17:38

+0

詹姆斯,我已經發布了上面的網絡檢查器輸出。 – ThoughtCrhyme 2010-07-01 19:00:23

回答

2

所以,我剛剛結束了做這個,接口:

[OperationContract] 
[WebInvoke(Method = "POST", 
      UriTemplate = "LoggingTest/{logID}/{logLevel}?errorCode={errorCodeInt}", 
      BodyStyle = WebMessageBodyStyle.Bare)] 
void LoggingTest(string logID, string logLevel, int errorCodeInt, Stream message); 

實現:

public void LoggingTest(string logID, string logLevel, int errorCodeInt, Stream message) 
    { 
     switch (logLevel) 
     { 
      case "error": 
       log.Error(errorCodeInt, message, null); 
       break; 
      case "warn": 
       log.Warn(errorCodeInt, message, null); 
       break; 
      case "info": 
       log.Info(errorCodeInt, message, null); 
       break; 
      case "debug": 
       log.Debug(errorCodeInt, message, null); 
       break; 
     } 
    } 

現在它可以工作。必須是與傳遞的UriTemplate的參數,因爲當我改成了傳遞的參數,像這樣:

UriTemplate = "LoggingTest/{logID}/{logLevel}?errorCode={errorCodeInt}", 

它開始接受POST。

編輯7/7:下面是最終的JavaScript也:

jqueryPost('LoggingTest/LogID/debug?errorCode=0', { message: 'this is a test message'} ; 

function jqueryPost(url, message) { 
    $.post(url, message); 
} 
+0

我想知道,你可以發佈你的最終Javascript,以便我們可以查看解決方案的端到端。 – 2010-07-02 20:48:14

+0

週二我回到辦公室後我會發布,謝謝Mark的興趣。 – ThoughtCrhyme 2010-07-04 05:28:27

+0

這是一種方法來傳遞一個沒有uritemplate字符串值,在後身? – enguerran 2012-07-02 15:42:22

1

嘗試增加服務合同上以下行,也我認爲你應該使用WrappedRequest insted的裸的

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

瞭解這一post爲更多的裝飾

+0

我已經嘗試在實現中允許AspNetCompatibilityRequirementsMode(不能將其添加到接口)。我已經在Bare和Wrapped請求之間切換。雖然我在網上看到了幫助很多其他人的地方...可悲的是沒有運氣。 – ThoughtCrhyme 2010-06-30 07:13:12

+0

你正在使用什麼配置,你可以在這裏粘貼配置嗎?你有沒有檢查過我已經給過參考? – IBhadelia 2010-07-01 04:21:56

+0

我沒有使用IIS,所以沒有.config – ThoughtCrhyme 2010-07-01 20:54:07

1

這可能是得到它爲你工作難題的只是其中的一部分,但是這抓住了我出去了一段時間:

您可能需要仔細檢查您的JSON語法,我認爲它需要在變量和變量名稱周圍使用雙引號字符串。

例如

function jqueryPost() { 
    var url = "/LoggingTest"; 
    $.post(url, { message: "test message" }); 
} 

需要是:

function jqueryPost() { 
    var url = "/LoggingTest"; 
    $.post(url, { "message": "test message" }); 
} 

注:雙引號 「消息」


編輯:謝謝你下面的反饋,這裏幾個環節可能證明是有用的格式化JSON:

+0

-1:該對象不是「JSON」,它只是另一個JavaScript對象。 JS對解析更爲寬鬆,不需要雙引號。 – 2011-06-01 13:28:02

+0

嗨@Matti Virkkunen,我看到你從哪裏來......我同意JavaScript本身更「寬鬆」,但數據交換格式(即不需要JavaScript)的JSON更加嚴格。 www.JSON.org建議使用雙引號。但說實話,我找不到一個ECMAScript 5權威信息工作草案的好鏈接,但http://developer.yahoo.com/yui/json/(關於JSON格式)非常權威。請記住,JSON語法不是JavaScript說的(記住,JSON可以與JavaScript一起使用),它只是一種基於/受javacript子集啓發的格式。 – 2011-06-01 14:53:22

+0

@Matti Virkkunen說完上述所有內容後,確實如此,您可以避免在值/字符串對中使用雙引號。 jquery.post文檔中的示例沒有它們。實際上,jquery.post文檔甚至沒有說明你需要使用JSON。但無論如何,我認爲它不值得-1,特別是因爲服務器端的c#需要雙引號。 http://stackoverflow.com/questions/4939620/can-wcf-accept-json-encoded-using-single-quotes-and-non-quoted-identifiers如果我已經幫助澄清的事情,請隨時提出你的 - 1,如果不是無後顧之憂。 – 2011-06-01 14:58:53