レポートでカスタム アセンブリを使用すると問題が発生します。Microsoft SQL Server 2012 Express Edition と Reporting Services を使用しており、Microsoft Visual Studio 2010 でレポートを設計しています。
シナリオ: Reporting Services では、パラメーターに基づいてレポートの言語を基にしたいと考えています。すべての文字列は、単純な「翻訳」メソッドを持つ Web サービスの助けを借りて翻訳されます。レポートでは Web サービスを参照できないため、Web サービスにアクセスするカスタム アセンブリを使用しました。アセンブリに正しいアクセス許可を与えた後、.dll を正しい場所に配置すると、すべてが魅力的に機能しました。
問題: Web サービスがカスタム アセンブリで参照されると、以下に示すようにapp.configファイルがsystem.serviceModelノードで生成されます。
<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の設定を変更したい場合は、これをプログラムで追加して、アセンブリを再構築する必要があります。これを回避するために、Reporting Services が認識できるように、ServiceModel を構成ファイルのどこかにコピー & ペーストできるかどうかを知りたいです。
質問:カスタム アセンブリがエンドポイントを取得し、Web サービスへの接続を管理するには、どの構成ファイルを調整する必要がありますか?
正しいアクセス許可が設定されており、dll が正しい場所にあると既に想定できます。ただし、app.config をどこに保存するか、またはどの構成ファイルを変更する必要があるかはわかりません。