在Window服务中使用RIA Service项目的DLL

时间:2012-03-28 13:11:05

标签: wcf windows-services wcf-ria-services

我有一个项目,它有RIAService,实体框架引用了我的Silvelright项目。所以当我构建构建RIA服务项目的DLL的项目并将其放在Silverlight项目的Bin / Debug文件夹中时。

域名服务功能如下

[EnableClientAccess()]
public partial class MyClassDomainService : LinqToEntitiesDomainService<MyDatabaseEntities>
{
    [Invoke]
    public void MyFunction(int Para1, string Para2, int Para3, string Para4)
    {
          //mycode
    }
}

现在我构建这个项目并将此RIAService.dll和其他需要的DLL复制到我的另一个项目是窗口服务项目。

现在在窗口服务中,我正在创建此域服务的对象,如下面的timerQlinkRequest_Elapsed()函数。

private void timerQ_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    try
    {
        MyClassDomainContext objcontext = new MyClassDomainContext();
        objcontext.MyFunction(1, "ADD", 1234, "Vehicle");
    }
    catch (Exception ex)
    {
        LogMessage("Error : StackTrace : " + ex.StackTrace);
    }
}

安装和启动窗口服务后,我在日志文件中的ex.stackTrace中得到以下错误,如下所示

Error : StackTrace :    at MS.Internal.JoltHelper.get_Context()
   at MS.Internal.XcpImports.Application_GetCurrent(IntPtr& pApp)
   at System.Windows.Application.get_Current()
   at System.ServiceModel.DomainServices.Client.WebDomainClient`1.ComposeAbsoluteServiceUri()
   at System.ServiceModel.DomainServices.Client.WebDomainClient`1..ctor(Uri serviceUri)
   at RIAService.Web.Service.QLink.MyClassDomainContext..ctor()
   at MywindowService.MyService1.timerQ_Elapsed(Object sender, ElapsedEventArgs e)

所以我的主要困惑是,我可以这样做吗?如果是,那么我哪里出错?

请帮帮我。

等待回复。

2 个答案:

答案 0 :(得分:1)

你不应该做你想做的事情。创建WCF RIA是为了弥合服务器和客户端应用程序的特定实现之间的差距。在构建项目时,会发生各种代码生成,将客户端与服务器上的实现联系起来。

现在,你可以做的是:

  1. 将您的第二个客户端移动到同一解决方案,并将其作为第二个RIA客户端添加到Silverlight.Web项目中。您可以从项目设置中执行此操作,您将获得完整的RIA权益。
  2. 您可以尝试调用已部署的RIA服务,就像它是WCF服务一样;毕竟它被称为WCF RIA服务是有原因的。现在您将无法获得所有内置支持(主要由代码生成提供),但您仍然可以通过WCF操作手动执行CRUD操作。检查here“直接浏览域服务”部分, 了解如何找到svc文件。
  3. 如果您要使用编辑功能,我建议使用第一个选项。但是对于只读数据,第二个选项应该相对轻松地工作。但话又说回来,我建议公开一个O-Data端点,这在WCF RIA中非常容易。

答案 1 :(得分:0)

我以其他方式获得解决方案,

在我的project.Web(ASP.NET项目)中我创建了一个简单的WCF应用程序,它调用我的WCF RIA服务的功能。

在窗口服务解决方案中,我添加该WCF服务的服务引用并调用该WCF函数并完成我的任务。

@duluca谢谢你的回复。