Вопрос по ajax, wcf, asp.net-mvc – ajax вызов wcf из asp.net mvc

2

У меня есть два приложения. Первый - сервис 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>

Но в Firebug я получаю ошибку:400 Bad Request.
Как позвонитьHelloWorld метод правильно? Благодарю.

Ваш Ответ

2   ответа
3

одни и те же политики происхождения это встроено в браузеры. Эта политика запрещает отправку междоменного запроса AJAX. Поскольку вы упомянули, что у вас есть 2 приложения, я подозреваю, что вы используете это ограничение, потому что у вас есть, например, первое приложение, размещенное наhttp://localhost:1234/ (тот, который содержит файл javascript), и вы пытаетесь отправить запрос AJAX наhttp://localhost:7215/ (тот же домен, другой порт => та же политика происхождения нарушена).

Есть несколько Обходные. Один из них заключается в настройке службы для отправки JSONP ответ вместо JSON. Вот пример приложения службы WCF на MSDN, который показывает, как вы можете настроить его. В основном вам нужно включитьcrossDomainScriptAccessEnabled переключатель, как показано на это сообщение в блоге.

11

WCF сервис от JavaScript?

Первая проблема, которую я вижу, заключается в том, что ваш сервис еще не готов к использованию из JavaScript :(. Необходимо внести следующие изменения ..

НастроитьService1 класс сAspNetCompatibilityRequirements поведение.

Отметьте метод обслуживания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 });
  }
}

Следующий.

ConfigurewebHttpBinding для службы (убедитесь, что вы изменили название службы и контракта!).

<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>

Так что теперь сервис готов!

Позволяет вносить изменения на стороне клиента (Вы получаете некоторые данные из службы, так почемуПОСЛ?)

  <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 работают в одном домене.

Но если это не так, то вы получите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_contro

Ух ты, отличный ответ. Большое спасибо. У меня есть еще один вопрос. У меня есть несколько методов в приложении ASP.NET MVC, которые получают данные из внешнего приложения win (не мое) (по tcp / ip). А теперь я хочу переместить эти методы в службу WCF, а также другие методы (отправлять сообщения электронной почты и другие процессы, которые теперь выполняются в отдельном потоке). Это мой первый опыт работы с веб-сервисами / wcf. И каков лучший способ сделать это: wcf, веб-сервис, сервис win? Благодарност user1260827
Я бы предложил опубликовать это как отдельный вопрос VJAI
Нашел этот ответ, который помог мне начать работать с JavaScript + WCF. Хотя одна вещdataInначение @ JSON у меня не сработало. Мне нужно было заменить его наvar dataIn = "input=" + personName; и достаньcontentType:.... Это привело к тому, что он вернул JSON, но все еще требовал ввода строки запроса. Nick Gotch
Hi @ Отметьте, что я сталкиваюсь с той же проблемой, но только когда я выкидываю исключение Я не могу увидеть фактическое исключение, которое выдается из службы WCF. / Stackoverflow.com вопросы / 34260982 / ... Silly Volley

Похожие вопросы