2012-05-26 80 views
2

我有兩個應用程序。第一個是WCF服務,第二個是asp.net MVC 3應用程序。
在WCF應用程序,我有一個接口:ajax從asp.net調用wcf mvc

[ServiceContract] 
    public interface IService1 
    { 
     [OperationContract] 
     string HelloWorld(string personName); 
    } 

和A類:

public class Service1 : IService1 
    { 
     public string HelloWorld(string personName) 
     { 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      return serializer.Serialize("Hello " + personName); 
     } 
    } 

現在,在asp.net的MVC應用程序,我想呼籲通過Ajax這個方法:

<script type="text/javascript"> 
    var personName = "John"; 
    var dataIn = '{' + '"input":"' + personName + '"}'; 
    $.ajax({ 
     url: "http://localhost:7215/Service1.svc/HelloWorld", 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     data: dataIn, 
     dataType: "json", 
     success: function (data) { 
      var object = JSON.parse(data.d); 
      if (object.Error == '') { 
       $("#response").html(object); 
      } 
     }, 
     error: function (error) { 
      alert("Error: " + error); 
     } 
    }); 
    </script> 

但在Firebug中出現錯誤:400 Bad Request
如何正確調用HelloWorld方法? 謝謝。

回答

11

所以你試圖消費WCF服務JavaScript

我看到的第一個問題是,你的服務還沒有準備好從JavaScript消耗:(。你必須做如下修改..

  1. AspNetCompatibilityRequirements行爲配置Service1類。

  2. 馬克服務方法HelloWorld接口與WebGet屬性。 [你需要參照System.SericeModel.Web組件]

使得兩名更改後..

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    [WebGet(ResponseFormat = WebMessageFormat.Json)] 
    string HelloWorld(string personName); 
} 

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Service1 : IService1 
{ 
    public string HelloWorld(string personName) 
    { 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 

    // you are not returning data in proper JSON format, wrap the text in 
    // an anonymous object before serializing. 
    return serializer.Serialize(new { text = "Hello " + personName }); 
    } 
} 

下一頁..

  1. 配置webHttpBinding的服務(請確保您更改服務和合同的名稱!)。

    <system.serviceModel> 
        <behaviors> 
        <endpointBehaviors> 
         <behavior name="webHttpBehavior"> 
         <webHttp /> 
         </behavior> 
        </endpointBehaviors> 
        </behaviors> 
        <bindings> 
        <webHttpBinding> 
         <binding name="webHttpBindingWithJsonP" /> 
        </webHttpBinding> 
        </bindings> 
        <services> 
        <service name="MvcApplication3.Service1"> 
         <endpoint address="" binding="webHttpBinding" 
           bindingConfiguration="webHttpBindingWithJsonP" 
           contract="MvcApplication3.IService1" 
           behaviorConfiguration="webHttpBehavior"/> 
        </service> 
        </services> 
    </system.serviceModel> 
    

所以,現在的服務是準備好了!

讓我們做客戶端的改變(你都可以從服務的一些數據,爲什麼POST?)

<script type="text/javascript"> 
     var personName = "John"; 
     var dataIn = '{' + '"input":"' + personName + '"}'; 
     $.ajax({ 
     url: "http://localhost:50623/Service1.svc/HelloWorld", 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     data: dataIn, 
     dataType: "json", 
     success: function (data) { 
      var jsonData = JSON.parse(data); 
      $("#response").html(jsonData.text); 
     }, 
     error: function (error) { 
      alert("Error: " + error); 
     } 
     }); 
    </script> 

直到現在我認爲,無論是WCF服務和MVC應用程序正在同一個域中運行。

但如果不是這樣,那麼你將GETE一個405(不允許的方法)錯誤,由於跨域屏障

有不同的方法來解決這個問題!

1.使用JSONP

在這種情況下,你必須在crossDomainScriptAccessEnabled財產綁定設置爲true,你必須做出JSONP從jQuery的調用。

<binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" /> 

然後dataType"json"改變爲「jsonp"$.ajax方法。

<script type="text/javascript"> 
     var personName = "John"; 
     var dataIn = '{' + '"input":"' + personName + '"}'; 
     $.ajax({ 
     ... 
     dataType: "jsonp", 
     ... 
     }); 
    </script> 

2.使用CORS

參考這個..

http://www.w3.org/TR/cors/

https://developer.mozilla.org/en/http_access_control

+0

哇,很好的答案。十分感謝。我還有一個問題。在ASP.NET MVC應用程序中有幾個方法可以從外部win(而不是我的)應用程序(通過tcp/ip)檢索數據。現在我想將這些方法移動到WCF服務,還有其他方法(發送電子郵件消息和現在在單獨線程中運行的其他處理)。這是我第一次使用Web服務/ wcf。而且,有什麼更好的方式來做到這一點:wcf,web服務,贏得服務?謝謝 – user1260827

+0

我建議發佈這個作爲一個單獨的問題 – VJAI

+0

找到這個答案有助於讓自己與JavaScript + WCF滾動。有一件事:'dataIn' JSON值對我來說不起作用。我需要用'var dataIn =「input =」+ personName;'替換它,並取出'contentType:...'。這得到了它返回JSON的點,但仍然需要查詢字符串輸入。 –

3

您需要確保的第一件事是您沒有違反內置於瀏覽器中的same origin policy。此政策可防止您發送跨域AJAX請求。由於您提到您有2個應用程序,我懷疑您遇到此限制,因爲您有例如第一個託管在http://localhost:1234/(包含javascript文件的應用程序)的應用程序,並且您正在嘗試向http://localhost:7215/發送AJAX請求(同一個域,不同的端口=>違反同一來源的政策)。有幾個workarounds。其中之一包括配置服務發送一個JSONP響應而不是JSON。這裏是MSDN上的sample WCF service application,它說明了如何配置它。基本上你需要啓用crossDomainScriptAccessEnabled開關,如this blog post所示。