如何在ASP.NET WebForm中从javascript使用WCF服务?

时间:2011-02-11 12:48:16

标签: javascript asp.net wcf

我已按照MSDN上的说明:向客户端脚本公开WCF服务(http://msdn.microsoft.com/en-us/library/bb514961.aspx),但该示例未显示如何实际使用javascript中的服务,这是我被卡住的地方。

我创建了一个非常简单的WCF服务:

使用System.ServiceModel;  使用System.Text; 使用System.ServiceModel.Activation;

命名空间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'为null或不是对象 错误:对象不支持此属性或方法

备注:

  • 我正在加载其他一些脚本,例如jQuery和jQuery UI(包括法语本地化,我目前只能在Google上找到它)。
  • 我无法弄清楚我是否绝对必须使用Sys.require方法,或者我是否可以像过去那样直接引用所需的脚本。
  • 我将脚本管理器和脚本元素放在页面底部,在表单元素之外但在body元素内部,这是正确的位置,还是应该全部在头部?
  • 我将EnableCDN参数设置为true,因此我使用的是Microsoft内容分发网络,尽管我自己真的很喜欢托管这些脚本。这是一个内部项目,可能有很长的使用期限,很少干预,所以当微软决定升级他们的脚本并破坏兼容性时,我宁愿不要从我的脚下拉出地毯。但是,我实际上无法弄清楚如何下载这些脚本,或者我是否需要(也许它们捆绑在我的磁盘上的某个资源文件中)。虽然我可以在这里找到一些脚本:http://www.asp.net/ajaxlibrary/CDNAjax4.ashx,但是有一些我找不到的脚本,比如MicrosoftAjaxTemplates.js(我还没有使用模板,但是我想给它一个bash之后)。
  • 我是否需要直接引用start.js脚本?我知道这是允许Sys.require方法工作的脚本,然后引入其余的脚本。
  • 我直接引用了System.scripts.WebServices;我需要这样做,还是在我有服务参考时自动引用?
  • 也许我在追逐我的尾巴,我根本不需要使用Sys.require?!

希望有人出色的可以给狗骨头,因为我迷路了!

谢谢,

帕特里克

1 个答案:

答案 0 :(得分:1)

想出一堆事情,也许这对其他人有用:

  • 不需要Sys.require。简单地添加带来所有漂亮的ASP.NET AJAX好东西。实际的.js文件被包装在二进制文件中的某个地方,因此不需要下载它们就可以在本地运行。
  • 一旦我撕开了Sys.require调用,我的代码就开始工作了。
  • 页面加载事件为:Sys.Application.add_load(function(){code here ...});
  • 为简化您的代码,请点击 - &gt;查看Service1.svc文件上的标记,并更改服务主机以使用Web脚本服务主机工厂,如下所示: &lt;%@ ServiceHost Service =“MyService”Factory =“System.ServiceModel.Activation.WebScriptServiceHostFactory”%&gt;
  • 不需要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" />
    

  • 瞧!