Я следовал инструкциям на 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