Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自自定义位置的WCF客户端配置_C#_.net_Wcf_Revit_Revit Api - Fatal编程技术网

C# 来自自定义位置的WCF客户端配置

C# 来自自定义位置的WCF客户端配置,c#,.net,wcf,revit,revit-api,C#,.net,Wcf,Revit,Revit Api,我是WCF的新手,正在尝试我的第一个服务(一个简单的使用情况报告服务)。我已经通过示例和教程创建了一个服务。我有一个简单的测试程序,可以运行我的核心代码并发送报告。目前,我运行的是本地托管的调试器,但运行这个简单的exe程序会托管服务,发送报告,服务会像预期的那样创建日志文件。。。一切都很好 现在,我的实际程序是另一个在其API(Autodesk Revit)中运行的商业程序的附加程序。在Revit API中运行完全相同的代码时,会出现一个错误,即没有定义端点。我的猜测是,这是因为它正在查找主R

我是WCF的新手,正在尝试我的第一个服务(一个简单的使用情况报告服务)。我已经通过示例和教程创建了一个服务。我有一个简单的测试程序,可以运行我的核心代码并发送报告。目前,我运行的是本地托管的调试器,但运行这个简单的exe程序会托管服务,发送报告,服务会像预期的那样创建日志文件。。。一切都很好

现在,我的实际程序是另一个在其API(Autodesk Revit)中运行的商业程序的附加程序。在Revit API中运行完全相同的代码时,会出现一个错误,即没有定义端点。我的猜测是,这是因为它正在查找主Revit.exe.config,它显然不会定义我的端点。我为我的dll创建了一个.config文件(MyLibrary.dll.config),在代码的执行目录中,它正确地定义了端点,但似乎无法识别

所以我的问题是如何让它从这个配置文件加载连接设置?或者我还有别的办法吗?我愿意以某种方式在代码中设置它,只是不知道如何让它连接

我不确定这是否重要,但以下是在独立程序中运行的配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
      <bindings>
        <basicHttpBinding>
          <binding name="BasicHttpBinding_IReportingService" />
        </basicHttpBinding>
      </bindings>
      <client>
        <endpoint address="http://localhost:8733/Design_Time_Addresses/SPECtrumReportingService/Service1/"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IReportingService"
            contract="ReportService.IReportingService" name="BasicHttpBinding_IReportingService" />
      </client>
    </system.serviceModel>
</configuration>
以下是引发的异常:

Could not find default endpoint element that references contract 'ReportService.IReportingService' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.
   at System.ServiceModel.Description.ConfigLoader.LoadChannelBehaviors(ServiceEndpoint serviceEndpoint, String configurationName)
   at System.ServiceModel.ChannelFactory.InitializeEndpoint(String configurationName, EndpointAddress address)
   at System.ServiceModel.ChannelFactory`1..ctor(String endpointConfigurationName, EndpointAddress remoteAddress)
   at System.ServiceModel.ConfigurationEndpointTrait`1.CreateSimplexFactory()
   at System.ServiceModel.ClientBase`1.CreateChannelFactoryRef(EndpointTrait`1 endpointTrait)
   at System.ServiceModel.ClientBase`1.InitializeChannelFactoryRef()
   at RDES.Revit.Sumex.CommonUse.ReportService.ReportingServiceClient..ctor() in c:\RD\Projects\13-004 SPECtrum\Code\SPECtrumBase\Service References\ReportService\Reference.cs:line 241
   at RDES.Revit.Sumex.CommonUse.ImportVM..ctor() in c:\RD\Projects\13-004 SPECtrum\Code\SPECtrumBase\ImportVM.cs:line 41
任何帮助都将不胜感激……

我发现这将引导我找到一个可能的答案。我现在更新了我的构造函数,如下所示:

_reporter = new ReportingServiceClient(new BasicHttpBinding(), new EndpointAddress("http://localhost:8733/Design_Time_Addresses/SPECtrumReportingService/Service1/"));
我将绑定保留为默认值,尽管看起来可以根据需要设置其他属性。我只是从在独立程序中工作的配置文件中提取端点地址,并用它来构造


这似乎在Revit内部按预期工作,至少在初步测试中是这样。有人能评论一下这是否会导致任何问题,或者是否有更好的方法来处理这种情况吗?

dll的配置文件与应用程序位于同一文件夹中并不相关。仅读取应用程序(可执行文件)的app.config文件。解决方案是将WCF服务配置从dll配置文件复制到应用程序的app.config文件

对于模块化应用程序,另一种解决方案是在代码中设置服务的ABC。问题在于,如果不重建和重新部署加载项,就无法对其进行配置

要完全在代码中创建WCF代理,可以使用以下内容:

IServiceContract proxy = ChannelFactory<IServiceContract>.CreateChannel(new WSHttpBinding(),
                    new EndpointAddress("<you url here>"));
IServiceTract代理=ChannelFactory.CreateChannel(新的WSHttpBinding(),
新地址(“”);

尽管您可以通过应用程序代码将端点信息注入代理类ReportingServiceClient,但第一类编程方法是使用app.config

在客户端配置中,您有一个名为“BasicHttpBinding_IReportingService”的端点,要使用该端点,您应该编写:

_reporter = new ReportingServiceClient("BasicHttpBinding_IReportingService");
如果你愿意

_reporter = new ReportingServiceClient();

要工作,请在客户端配置中定义的客户端端点中删除name属性或设置name属性值。这将是异常提到的所谓的“默认端点元素”。

您能发布异常的详细信息吗?当然,异常添加了看起来很有希望的hanks,我今天将试用它。。。那么,这与我在下面发布的内容有什么区别呢?抱歉,如果这是一个新手问题,但我是WCF的新手,正在尝试理解…好的,这让我开始了一些好的阅读,所以谢谢:)。看看我是否理解这里;使用上面的代码,它创建了一个“原始”接口实现,在我的例子中,它是一个IReportingService类型的对象。在我下面的代码中,它创建了一个ReportingServiceClient类型的对象,但如果我理解的话,该类基本上只是您正在创建的IReportingService类的包装器,从它调用我的服务方法只是传递到IReportingService。因此,您的代码和我的代码基本上做了相同的事情,对吗?从您的类名来看,我认为您是从ClientBase派生的。通常在自动生成代码时会发生这种情况。ClientBase确实是我发布内容的包装。ClientBase还提供了更好的连接管理,这意味着您可以在using语句中直接使用它。在我的示例中,您需要进行转换以处置资源。现在,我想到了一种使用dll配置文件的方法。我认为这将有助于你的设计。imo将设置复制到主app.config会破坏使用模块的目的。现在,应用程序对模块有所了解。阅读下一条注释。您可以使用ConfigurationManager.OpenMappedExeConfiguration使用dll配置。通过这种方式,您可以更改配置,而无需重新部署,也无需主应用程序了解有关模块的任何信息。您可以使用以下方法打开dll配置:var map=new ExeConfigurationFileMap();map.ExeConfigFilename=string.Format(“{0}.config”,Assembly.getexecutinggassembly().Location);var config=ConfigurationManager.OpenMappedExeConfiguration(映射,ConfigurationUserLevel.None);理论上,您应该能够使用config变量读取WCF设置。我从未对此进行过测试。但问题是,它不会读取该配置,因为我在另一个应用程序下运行,无法将配置信息放入主应用程序配置中。除非我弄错了,否则它不会读取该端点,因为它没有读取配置,对吗?我知道使用app.config是最佳实践,但除非我误解了在这种情况下是不可能的。这是我要问的基本问题…您有需要特定配置设置的myclient.dll。在App.exe中使用时,必须将设置复制到App.exe.config;在App2.exe中,然后是App2.exe.config;当托管在IIS中的Web服务中时,则为Web.config。这是必须的,尽管你可能会写很多代码来规避它。我会的
_reporter = new ReportingServiceClient();