2010-02-10 94 views
3

我们有一些ASP.NET的东西(它没有清楚地描述为称它为一个组件),我们希望清理并围绕一些边界,以便我们可以重复使用它。实际上,这有四个部分,一些标记,一些C#代码隐藏,一些在浏览器中运行的JavaScript,以及由javascript调用的web服务方法。共享程序集(DLL)中的ASP.NET webservices

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

无论如何,以上都不适用于我们,因为我们想创建一个可以包含在多个项目中的组件。这意味着我们需要一个我们可以包含在DLL中的组件,这意味着一个服务器控件,而不是一个用户控件。

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

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

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

因此,我正在寻找的是在ASP.NET 3.5中可以接近的程度。

想法?

+0

我喜欢这个问题的答案没有任何投票。 – 2014-08-08 20:15:41

回答

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

+0

我不确定我同意使用HttpHandlers。首先,它们仍然是ASP.NET编程中的一个晦涩难懂的东西,大多数开发人员并不常用,也没有很好的理解。其次,当一个未来的维护程序员试图理解控件时,它是控件的代码,以及他将要查看的页面。它可能只是web.config中的一行,但它不在视图中。 WebMethod在页面上将其功能委托给控件中的某个方法,其优点是可以存放在维护程序员将要查看的源文件中。 – 2010-02-12 13:52:38

+0

这是有道理的,我不从根本上不同意,但我不知道在DLL中嵌入端点时的现实替代方案。 – 2010-02-12 16:13:39

0

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

你确定你不能只是使Web服务功能的一部分的应用程序?它是做什么的,它需要成为一项服务?

+0

JavaScript正在浏览器上运行。它需要与运行在服务器上的代码异步通信。服务器上必须有东西在监听通信。 Web服务是这样做的通常机制。 web服务可以独立实现,也可以作为Web应用程序中的.asmx文件实现,也可以作为页面上的静态方法实现,标记为WebMethod(如果设置了EnablePageMethods)。 但是,所有这些都需要在服务器控制之外实例化一些东西。我想尽量减少。 – 2010-02-10 18:55:34

0

我会明确定义Web服务的API,以便服务器控件可以“知道”如何调用它们。应该动态实例化服务器控件,以便它将包含根据预先调用的API调用WebServices所需的JavaScript。在生产

  • 我有代码与配置JavsScript功能创建数据库驱动的动态控制
  • 上面后面标记为的WebMethod代码静态方法作为说明(如果的EnablePageMethods设置),可以调用一些DB: 我提出这一点,因为进一步层等
  • 你可以使用jQuery从WebService推新数据页面asyncronously

无论如何,我会很高兴也了解其他办法...

反正检查此link

Using jQuery to directly call ASP.NET AJAX page methods

+0

是的,所有这一切。我希望ServerControl的用户能够尽可能地使用该控件。这意味着ServerControl封装了web服务的外观,它是如何被调用的,它返回的是什么等。但是如何运行web服务是个问题。 在页面上放置一个WebMethod非常简单,但这需要ServerControl的用户在页面上创建WebMethod。当它被添加到页面时,我宁愿让ServerControl创建WebMethod。但我不确定这是可能的。 – 2010-02-10 21:06:33

+0

我明白了。我可以给你的唯一提示是检查CodePlex中的BlogEngine源代码 - 项目中的页面是从一开始就动态创建的......我想如果可以动态创建整个页面,应该可以添加静态Web方法动态...无论如何,我仍然对你的问题的解决方案感兴趣 - 我想这也将很快成为我的问题; )所以,如果你可以发布一些博客链接或任何你如何解决这个问题,我将不胜感激...... – 2010-02-11 06:45:00

0

我看到这个帖子已经有两三年了,但我认为我会把我的两分钱投入到它的价值中。

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

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

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

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

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

不幸的是,尽管它并不完美,但这仅仅是 最好的 解决方案,我已经能够将所有描述的功能完全包装到单个可重用服务器控件中。

如果你有兴趣,这里是complete source (with demos)

+0

我最终做的是在组件中创建一个实现我所需的所有功能的类。当我在Web应用程序中使用程序集时,我编写了一个提供接口的.asmx Web服务,并简单地将这些参数转发给实现类的实例。 – 2012-05-09 14:37:16