2012-12-13 67 views
-2

我有以下情形:CORS,的ASP.NET Web API,劍道UI

  • 一個ASP.NET Web API項目(在本地主機託管:8081),它要求我BLL來實現業務邏輯
  • 一個ASP.NET MVC4項目(託管在本地主機:8080)將形成我的Web層
  • 未來計劃添加移動等項目
  • 我按照步驟設置CORS結構,以允許跨域的Ajax請求作爲定義於this article

我有一個API服務從數據庫中返回「somelist」。

  • 當我通過小提琴手做一個簡單的請求,我從服務器獲取

請求權響應:


    POST http://localhost:8081/api/orgs/getsomelist HTTP/1.1 
    User-Agent: Fiddler 
    Content-type: application/json 
    Host: localhost:8081 
    Content-Length: 158 

    {"token": "sometoken","kValues": { "userId": "1.0" }} 

響應:


    HTTP/1.1 200 OK 
    Cache-Control: no-cache 
    Pragma: no-cache 
    Content-Type: application/json; charset=utf-8 
    Expires: -1 
    Server: Microsoft-IIS/8.0 
    X-AspNet-Version: 4.0.30319 
    X-SourceFiles: =?UTF-8?B?WjpcRG9jdW1lbnRzXGNvZGVcSnNyZWVcSnNyZWVcSnNyZWUuQXBpXGFwaVxvcmdzXGdldG15b3Jncw==?= 
    X-Powered-By: ASP.NET 
    Date: Thu, 13 Dec 2012 22:15:34 GMT 
    Content-Length: 315 

    {successful JSON response} 
  • 當我從web應用程序(在localhost:8080)做同樣的事情用一個簡單的Ajax POST調用,菲德勒表示由2個請求,1點返回200次的成功和其他500內部服務器

    Code: 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8;", 
     crossDomain: true, 
     url: "@urlToConnect", 
     withCredentials: true, 
     dataType: "json", 
     data: JSON.stringify({token: "sometoken",kValues: { userId: "1.0" }}) 
    }); 

第一次請求:由於某種原因,它顯示了OPTIONS調用,而不是POST


    OPTIONS http://localhost:8081/api/orgs/getsomelist HTTP/1.1 
    Host: localhost:8081 
    Connection: keep-alive 
    Access-Control-Request-Method: POST 
    Origin: http://localhost:8080 
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11 
    Access-Control-Request-Headers: origin, content-type, accept 
    Accept: */* 
    Referer: http://localhost:8080/ 
    Accept-Encoding: gzip,deflate,sdch 
    Accept-Language: en-US,en;q=0.8 
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

1日響應:


    HTTP/1.1 200 OK 
    Cache-Control: no-cache 
    Pragma: no-cache 
    Expires: -1 
    Server: Microsoft-IIS/8.0 
    Access-Control-Allow-Origin: http://localhost:8080 
    Access-Control-Allow-Methods: POST 
    Access-Control-Allow-Headers: origin, content-type, accept 
    X-AspNet-Version: 4.0.30319 
    X-SourceFiles: =?UTF-8?B?WjpcRG9jdW1lbnRzXGNvZGVcSnNyZWVcSnNyZWVcSnNyZWUuQXBpXGFwaVxvcmdzXGdldG15b3Jncw==?= 
    X-Powered-By: ASP.NET 
    Date: Thu, 13 Dec 2012 22:15:16 GMT 
    Content-Length: 0 

第二個請求:


    POST http://localhost:8081/api/orgs/getsomelist HTTP/1.1 
    Host: localhost:8081 
    Connection: keep-alive 
    Content-Length: 127 
    Origin: http://localhost:8080 
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11 
    Content-Type: application/json; charset=UTF-8; 
    Accept: application/json, text/javascript, */*; q=0.01 
    Referer: http://localhost:8080/ 
    Accept-Encoding: gzip,deflate,sdch 
    Accept-Language: en-US,en;q=0.8 
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

    {"token": "sometoken","kValues": { "userId": "1.0" }} 

第二回應:我的Web API的方法是不能夠得到張貼的JSON數據的權利。當直接在提琴手例如1以上


    HTTP/1.1 500 Internal Server Error 
    Cache-Control: no-cache 
    Pragma: no-cache 
    Content-Type: application/json; charset=utf-8 
    Expires: -1 
    Server: Microsoft-IIS/8.0 
    Access-Control-Allow-Origin: http://localhost:8080 
    X-AspNet-Version: 4.0.30319 
    X-SourceFiles: =?UTF-8?B?WjpcRG9jdW1lbnRzXGNvZGVcSnNyZWVcSnNyZWVcSnNyZWUuQXBpXGFwaVxvcmdzXGdldG15b3Jncw==?= 
    X-Powered-By: ASP.NET 
    Date: Thu, 13 Dec 2012 22:15:16 GMT 
    Content-Length: 906 

    {"Message":"An error has occurred.","ExceptionMessage":"some .NET exception"} 
  • POST方法我沒有得到這個例外使用相同的數據。當我使用kendoui數據源做同樣的事情,我會得到相同的2個錯誤,但我的要求上提琴手顯示垃圾數據,不是我送

Code: 
    dataSource: new kendo.data.DataSource({ 
      transport: { 
       read: { 
        type: "POST", 
        contentType: "application/json; charset=utf-8;", 
        crossDomain:true, 
        url: "@urlToConnect", 
        withCredentials: true, 
        dataType: "json", 
        data: JSON.stringify({token: "sometoken",kValues: { userId: "1.0" }}) 
       } 
      }, 
      schema: { 
       data: "data", 
       type: "json", 
       total: "count" 
      } 

請求的JSON:JSON.stringify發出怪異的數據


    POST http://localhost:8081/orgs/somelist HTTP/1.1 
    Host: localhost:8081 
    Connection: keep-alive 
    Content-Length: 705 
    Cache-Control: max-age=0 
    Origin: http://localhost:8080 
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11 
    Content-Type: application/json; charset=UTF-8; 
    Accept: application/json, text/javascript, */*; q=0.01 
    Referer: http://localhost:8080/ 
    Accept-Encoding: gzip,deflate,sdch 
    Accept-Language: en-US,en;q=0.8 
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

    0=%7B&1=%22&2=t&3=o&4=k&5=e&6=n&7=%22&8=%3A&9=%22&10=1&11=F&12=V&13=R&14=A&15=I&16=1&17=E&18=b&19=7&20=%2F&21=%2F&22=M&23=7&24=U&25=A&26=Y&27=h&28=q&29=9&30=i&31=R&32=Z&33=U&34=%2F&35=Y&36=j&37=l&38=o&39=0&40=Q&41=5&42=Z&43=g&44=A&45=H&46=8&47=4&48=%2F&49=5&50=b&51=E&52=g&53=Z&54=F&55=M&56=%2B&57=p&58=Q&59=j&60=0&61=x&62=4&63=w&64=Z&65=6&66=W&67=c&68=T&69=M&70=u&71=Q&72=n&73=K&74=3&75=P&76=x&77=e&78=T&79=C&80=%2F&81=0&82=K&83=K&84=W&85=1&86=w&87=o&88=5&89=2&90=%2B&91=d&92=V&93=R&94=v&95=A&96=%3D&97=%3D&98=%22&99=%2C&100=%22&101=k&102=V&103=a&104=l&105=u&106=e&107=s&108=%22&109=%3A&110=%7B&111=%22&112=u&113=s&114=e&115=r&116=I&117=d&118=%22&119=%3A&120=%22&121=1&122=.&123=0&124=%22&125=%7D&126=%7D 

我不知道爲什麼,當我直接或從kendoui數據源做一個Ajax調用設置不起作用

回答

0

請問您要留言要爲數據的字符串的方法是什麼?你有沒有嘗試過使用JavaScript對象作爲數據?

此外,您首先查看的選項請求是因爲您正在提出跨域請求。它發送選項「pre-flight」檢查以獲取Access-Control-Allow-Origin來查看是否允許發送POST。如果您的localhost:8080不在Access-Control-Allow-Origin中,那麼它甚至不會發送POST。 Anglin在使用kendo啓用crossdomain調用方面做了很好的寫作。他使用odata,但一些校長適用。 http://www.kendoui.com/blogs/teamblog/posts/11-08-23/cross-domain_queries_to_odata_services_with_jquery.aspx

+0

謝謝你的建議,以及另一個有點類似的問題在stackoverflow幫助我解決這個問題。 – Mickey