从asp.net mvc对wcf的ajax调用

从asp.net mvc对wcf的ajax调用,ajax,asp.net-mvc,wcf,Ajax,Asp.net Mvc,Wcf,我有两个应用程序。第一个是WCF服务,第二个是asp.net MVC 3应用程序。 在WCF应用程序中,我有一个界面: [ServiceContract] public interface IService1 { [OperationContract] string HelloWorld(string personName); } 还有一节课: public class Service1 : IService1 {

我有两个应用程序。第一个是WCF服务,第二个是asp.net MVC 3应用程序。
在WCF应用程序中,我有一个界面:

    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string HelloWorld(string personName);
    }
还有一节课:

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>

var personName=“John”;
var dataIn='{'+'“输入”:“'+personName+'“}”;
$.ajax({
url:“http://localhost:7215/Service1.svc/HelloWorld",
类型:“POST”,
contentType:“应用程序/json;字符集=utf-8”,
数据:数据输入,
数据类型:“json”,
成功:功能(数据){
var object=JSON.parse(data.d);
如果(object.Error==''){
$(“#响应”).html(对象);
}
},
错误:函数(错误){
警报(“错误:+错误”);
}
});
但是在Firebug中我得到了错误:
400错误请求

如何正确调用
HelloWorld
方法?
谢谢。

您需要确保的第一件事是您没有违反内置浏览器的。此策略防止您发送跨域AJAX请求。由于您提到您有两个应用程序,我怀疑您达到了这个限制,因为您有第一个应用程序托管在
http://localhost:1234/
(包含javascript文件的文件),并且您正试图向
http://localhost:7215/
(违反了相同域、不同端口=>相同源策略)


有几种。其中一种是将服务配置为发送响应而不是JSON。下面是MSDN上的一个示例,说明了如何配置它。基本上,您需要启用
crossDomainScriptAccessEnabled
开关,如中所示。

那么您正试图从JavaScript使用WCF服务吗

我看到的第一个问题是,您的服务尚未准备好从JavaScript中使用:(。您必须进行以下更改

[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 });
  }
}
  • 使用
    AspNetCompatibilityRequirements
    行为配置
    Service1

  • 在带有
    WebGet
    属性的界面中标记服务方法
    HelloWorld
    。 [您需要参考
    System.seriemodel.Web
    assembly]

  • 在做了这两个改变之后

    [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 });
      }
    }
    
    接下来

  • 为服务配置
    webHttpBinding
    (确保更改服务和合同名称!)

    然后在
    $.ajax
    方法中将
    数据类型从
    “json”
    更改为“
    jsonp”

      <script type="text/javascript">
          var personName = "John";
          var dataIn = '{' + '"input":"' + personName + '"}';
          $.ajax({
             ...
             dataType: "jsonp",
             ...
          });
       </script>
    
    
    var personName=“John”;
    var dataIn='{'+'“输入”:“'+personName+'“}”;
    $.ajax({
    ...
    数据类型:“jsonp”,
    ...
    });
    
    2.使用CORS

    参考这个


    哇,回答得很好。非常感谢。我还有一个问题。我有ASP.NET MVC应用程序中的几种方法,可以从外部win(而不是我的)应用程序(通过tcp/ip)检索数据。现在我想将这些方法移到WCF服务,以及其他方法(发送电子邮件和其他进程,它们现在在单独的线程中运行)。这是我第一次使用web服务/wcf。还有,更好的方法是什么:wcf、web服务、win service?ThanksI建议将此作为一个单独的问题发布。我发现这个答案有助于我使用JavaScript+wcf。不过有一件事是:
    dataIn
    JSON值对我不起作用。我需要替换它使用
    var dataIn=“input=“+personName;”
    并取出
    contentType:…
    。这使得它返回JSON,但仍然需要querystring输入。Hi@Mark我面临同样的问题,但只有在抛出异常时才遇到。我无法看到从WCF服务中抛出的实际异常。
    <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
    
      <script type="text/javascript">
          var personName = "John";
          var dataIn = '{' + '"input":"' + personName + '"}';
          $.ajax({
             ...
             dataType: "jsonp",
             ...
          });
       </script>