Как использовать службу WCF из JavaScript в веб-форме ASP.NET? - PullRequest
0 голосов
/ 11 февраля 2011

Я следовал инструкциям на MSDN: Предоставление служб WCF клиентскому сценарию (http://msdn.microsoft.com/en-us/library/bb514961.aspx),, однако пример не показывает, как на самом деле использовать службу в javascript, где я застреваю.

Я создал очень простой сервис WCF:

с использованием System.ServiceModel; используя System.Text; using System.ServiceModel.Activation;

namespace MyNamespace {

[ServiceContract(Namespace = "MyDomain.com")]
public interface IMyService
{
    [OperationContract]
    void DoWork();
}

// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "McCormickProdService" in code, svc and config file together.
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyService : IMyService
{
    public void DoWork()
    {
    }
}

}

Я также обновил web.config:

  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="default"/>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="webScriptEnablingBehavior">
          <enableWebScript/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service name="MyNamespace.MyService"
         behaviorConfiguration="">
        <endpoint address="" binding="webHttpBinding"
          bindingConfiguration="default"
          contract="MyNamespace.IMyService"
          behaviorConfiguration="webScriptEnablingBehavior"/>
      </service>
    </services>
  </system.serviceModel>

А вот код, который я собрал в ASP.NET / javascript:

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="false" EnableCdn="true" AjaxFrameworkMode="Explicit">
    <Scripts>
        <asp:ScriptReference Path="http://ajax.aspnetcdn.com/ajax/act/40412/start.js" />
    </Scripts>
    <Services>
        <asp:ServiceReference Path="~/Services/MyService.svc"/>
    </Services>
</asp:ScriptManager>
<asp:ContentPlaceHolder ID="endbody" runat="server" />

<script type="text/javascript">

    Sys.loader.defineScripts(null, [{ name: "jQueryUI", releaseUrl: "http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.9/jquery-ui.min.js", dependencies: ["jQuery"], isLoaded: !!(window.jQuery && jQuery.ui)}]);
    Sys.loader.defineScripts(null, [{ name: "jQueryUIdatepickerfr", releaseUrl: "http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/jquery.ui.datepicker-fr.js", dependencies: ["jQueryUI"], isLoaded: !!(window.jQuery && jQuery.ui)}]);

    Sys.require([
        Sys.scripts.ApplicationServices,
        Sys.scripts.Templates,
        Sys.scripts.DataContext,
        Sys.scripts.WebServices,
        Sys.scripts.jQuery,
        Sys.scripts.jQueryUI,
        Sys.scripts.jQueryUIdatepickerfr], function () {

            MyDomain.com.IMyService.DoWork(function () { alert('success') }, function () { alert('failure') }, null);
        });  

</script>

Когда я загружаю свою страницу, я получаю следующие ошибки:

Ошибка: Sys.Net.WebServiceProxy является нулевым или не является объектом Ошибка: объект не поддерживает это свойство или метод

Примечания:

  • Я загружаю несколько других скриптов, таких как jQuery и jQuery UI (включая французскую локализацию, которую я пока мог найти только в Google).
  • Я не могу понять, нужно ли мне обязательно использовать метод Sys.require или я мог бы просто ссылаться на нужные скрипты, используя напрямую, как мы это делали в старину.
  • Я поместил диспетчер скриптов и элементы скрипта внизу моей страницы, вне элемента формы, но внутри элемента body, это правильное место или все это должно быть в голове?
  • Я установил для параметра EnableCDN значение true, поэтому я использую сеть распространения контента Microsoft, хотя я действительно предпочел бы сам размещать эти сценарии. Это внутренний проект, который может иметь длительный срок службы с небольшим вмешательством, поэтому я бы предпочел, чтобы коврик не вырывался из-под моих ног, когда Microsoft решает обновить свои сценарии и нарушить совместимость. Тем не менее, я не могу понять, как загрузить эти сценарии, или если мне даже нужно (возможно, они находятся внутри какого-то файла ресурсов где-то на моем диске). Хотя я могу найти здесь некоторые сценарии: http://www.asp.net/ajaxlibrary/CDNAjax4.ashx, есть некоторые сценарии, которые я не могу найти, например, MicrosoftAjaxTemplates.js (я пока не использую шаблоны, но я бы хотел дать его чуть позже).
  • Нужно ли ссылаться на скрипт start.js напрямую? Я понимаю, что это сценарий, который позволяет работать методу Sys.require, который затем вводит оставшиеся сценарии.
  • Я ссылался на System.scripts.WebServices напрямую; мне нужно сделать это, или на это ссылаются автоматически, когда у меня есть сервисная ссылка?
  • Возможно, я гоняюсь за хвостом впустую, и мне вообще не нужно использовать Sys.require?!

Надеюсь, кто-то блестящий может дать собаке кость, потому что я потерян!

Спасибо

Patrick

1 Ответ

1 голос
/ 12 февраля 2011

Разобрался с кучей вещей, возможно, это будет полезно другим:

  • Sys.require не нужен.Простое добавление приносит все приятные вкусности ASP.NET AJAX.Фактические файлы .js упакованы где-то внутри двоичного файла, поэтому их не нужно загружать, чтобы можно было запускать локально.
  • Как только я разорвал вызовы Sys.require, мой код начал работать.
  • Событие загрузки страницы: Sys.Application.add_load (function () {code here ...});
  • Чтобы упростить ваш код, нажмите кнопку мыши -> просмотреть разметку на Service1.svc и измените хост службы на использование фабрики хостов службы веб-сценариев следующим образом: <% @ ServiceHost Service = "MyService" Factory = "System.ServiceModel.Activation.WebScriptServiceHostFactory"%>
  • Тамнет необходимости в атрибутах ServiceBehaviour или AspNetCompatibilityRequirements.
  • Все, что требуется в файле web.config:

    <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" /> (or true for testing)
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    

  • Вуаля!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...