共享程序集(DLL)中的ASP.NET Web服务

时间:2010-02-10 17:27:03

标签: asp.net web-services controls

我们有一些ASP.NET的东西(它没有被清楚地描述为足以将其称为组件),我们想要清理它们并包围一些边界,以便我们可以重用它。这有四个部分,一些标记,一些C#代码隐藏,一些在浏览器中运行的javascript,以及一个由javascript调用的webservice方法。

清理这种方法的一种方法是将标记移动到用户控件中,将C#转换为用户控件的代码隐藏方法,将javascript转换为将由代码隐藏在页面中的文件方法,并将webservice转换为代码隐藏中的静态方法。 (当然,假设我可以将用户控件中的静态方法标记为WebMethod并让它工作,我还没有尝试过。)

在任何情况下,上述内容对我们都不起作用,因为我们想要创建一个可以包含在多个项目中的组件。这意味着我们需要一个可以包含在DLL中的组件,这意味着服务器控件,而不是用户控件。

当然,服务器控件意味着没有标记。 html需要由C#注入页面。这不是问题,我们之前已经做过了。包括javascript作为资源,并将服务器控件插入页面似乎并不太难。我还没有这样做,但我看到了很多关于如何做的例子,所以我相信我能够弄明白。

但是,我不确定我理解的部分是网络服务。此控件将包含将调用回Web服务的javascript。 Web服务将仅与服务器控件通信,但它需要与包含服务器控件的Web应用程序正在通信的同一数据库进行通信。也就是说,这不是我们可以配置单个独立Web服务的情况,服务器控件的所有实例都将与之通信,我们需要在每个包含服务器控件的Web应用程序中包含单独的Web服务。

问题是,由于服务器控件包含在DLL中,我们希望此Web服务的代码也包含在DLL中。现在,我能想到的是在DLL中定义一个类,它完成webservice所需的所有工作,然后可以通过我们在Web应用程序中定义的Web服务来调用。但我对此并不满意。在我的理想世界中,简单地在Web应用程序中包含服务器控件将自动包含和配置它需要与之通信的Web服务。但我不知道该怎么做,我不确定它是否可能。

所以我正在寻找的是在ASP.NET 3.5中我可以接近的可能性。

想法?

4 个答案:

答案 0 :(得分:1)

据我所知,没有办法将服务器端端点完全封装在服务器控件中。这是我过去没有完全满意的解决方案所摔跤的事情。

可能最干净,最惯用的.NET解决方案是将HttpHandler用于服务器端端点。消费应用程序将需要添加单行web.config,但不需要创建其他文件。

看看ASP.NET AJAX如何实现ScriptResource.axd,以获得此方法的一个好的具体示例。该源代码:http://www.microsoft.com/downloads/details.aspx?FamilyId=EF2C1ACC-051A-4FE6-AD72-F3BED8623B43&displaylang=en

答案 1 :(得分:0)

如果你的webservice只与一个控件通信,并且web应用程序的每个实例都需要它自己的webservice ....那么我不确定我是否认为它是web服务的目的。

您确定不能仅仅将Web服务功能作为应用程序的一部分吗?它需要做什么才能成为一项服务呢?

答案 2 :(得分:0)

我会清楚地定义Web服务的API,以便服务器控件“知道”如何调用它们。服务器控件应该动态实例化,以便它包含根据预定义API调用WebServices所需的JavaScript。 我提出这个是因为:

  • 我在生产中使用可配置的JavsScript功能创建数据库驱动的动态控件
  • 如上所述,标记为WebMethod的代码后面的静态方法(如果设置了EnablePageMethods)可以进一步调用某些数据库层。
  • 您可以使用JQuery将新数据从WebService推送到页面异步

无论如何,我很乐意阅读其他方法......

无论如何检查link

Using jQuery to directly call ASP.NET AJAX page methods

答案 3 :(得分:0)

我看到这篇文章已经有几年的历史了,但我认为我会把我的两美分投入到它的价值中。

如果我理解正确,我相信我正在做一些与我写的你可能想看的特定服务器控件类似的东西。

简而言之,它使用DLL中的旧式ICallbackEventHandler接口进行通信。我嵌入了javascript,它异步执行回调以直接与服务器控件通信。

这一切都运作良好,但您需要了解一些限制。

首先,CallbackEvent方法的重量不如静态WebMethod。我相信(至少大部分)页面生命周期是作为回调处理的一部分执行的。

第二个是“只能有一个”:)所以如果你有其他控件使用相同的CallbackEvent通信方式,你需要小心并确保你知道哪个控件正在触发回调。在我的控制中,我在RaiseCallbackEvent上有一个额外的参数,可以用来判断哪个控件进行了调用(并且它公开了一个用户可以订阅的自定义事件)。

不幸的是,尽管它并不完美,但这是我能够提出的 best 唯一的解决方案,它将您描述的所有功能完全包含在一个可重复使用的服务器控件中。< / p>

如果您有兴趣,可以使用complete source (with demos)