2

我有两个应用程序。第一个是 WCF Service,第二个是 asp.net MVC 3 app。
在 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>

但在 Firebug 中我得到错误:400 Bad Request.
如何HelloWorld正确调用方法?谢谢。

4

2 回答 2

12

所以你正试图从JavaScript使用WCF 服务

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

  1. 使用行为配置Service1AspNetCompatibilityRequirements

  2. HelloWorldWebGet属性标记接口中的服务方法。[你需要参考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 应用程序都在同一个域中运行。

但如果不是这种情况,那么由于CROSS-DOMAIN BARRIER ,您将收到405(Method Not Allowed)错误。

有不同的方法可以解决这个问题!

1.使用JSONP

在这种情况下,您必须在绑定中将crossDomainScriptAccessEnabled属性设置为true,并且您必须从 jQuery 进行 JSONP 调用。

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

然后将方法中的dataTypefrom更改"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

于 2012-05-26T14:07:23.190 回答
3

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

有几种解决方法。其中之一是将服务配置为发送JSONP响应而不是 JSON。这是 MSDN 上的示例 WCF 服务应用程序,它说明了如何配置它。基本上,您需要启用此博客文章crossDomainScriptAccessEnabled中所示的开关。

于 2012-05-26T07:08:18.273 回答