1

在我的报告中使用自定义程序集时遇到问题。我们正在使用带有 Reporting Services 的 Microsoft SQL Server 2012 Express Edition,并且正在 Microsoft Visual Studio 2010 中设计我们的报告

场景:在 Reporting Services 中,我们希望基于参数的报表语言。所有字符串都在具有简单“翻译”方法的 Web 服务的帮助下进行翻译。因为我们无法在报告中引用 Web 服务,所以我们使用了访问 Web 服务的自定义程序集。在授予程序集正确的权限后,将 .dll 放置在正确的位置后,一切都变得很有吸引力。

问题:当在自定义程序集中引用 Web 服务时,将生成一个带有system.serviceModel节点的app.config文件,如下所示。

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="ITranslatorServicebinding" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="WebServiceAddress"
            binding="basicHttpBinding" bindingConfiguration="TranslatorServicebinding"
            contract="Translator.ITranslatorService" name="ITranslatorServicePort" />
    </client>
</system.serviceModel>

显然,当在应用程序中使用 dll 时,该 dll 的配置文件应该位于引用它的应用程序的位置。因为在使用 Reporting Services 时我不知道在哪里存储这个特定的配置文件,所以我决定通过以下代码以编程方式添加它:

var remoteAddress = new System.ServiceModel.EndpointAddress(YourWebServiceURI);
using (var translateService = new Translator.TranslatorServiceClient(new System.ServiceModel.BasicHttpBinding(), remoteAddress))
{
   translateService.Endpoint.Binding.SendTimeout = new TimeSpan(0, 0, 1, 0);
   return translatedString = translateService.Translate(ISOCode, NativeString);
}

这足以让程序集找到 Web 服务并使用它。但是,如您所见,YourWebServiceUri在程序集中是硬编码的。我想避免这种情况。然后我决定在Reporting Services的web.config文件中添加一个键,如下所示:

<appSettings>
  <add key="WebServiceUri" value="YourWebServiceURI"/>
</appSettings>

但是,如果出于某种原因我想更改basicHttpBinding中的设置,那么我会以编程方式添加它并重建程序集。为避免这种情况,我想知道是否可以将 ServiceModel 复制并粘贴到配置文件中的某个位置,以便 Reporting Services 可以识别它。

问题:我需要调整哪个配置文件才能让自定义程序集获取端点并设法连接到 Web 服务?

您已经可以假设我设置了正确的权限并且 dll 位于正确的位置。但是我不知道在哪里存储 app.config,或者我需要更改哪个配置文件。

4

1 回答 1

2

最后是我需要用system.serviceModel更改的web.config重新启动报表服务器很重要,否则更改将不会生效。问题已解决。

于 2013-07-25T07:27:25.677 回答