5

はい、SO、MSDN、およびその他のサイトで他の質問を読みましたが、理解できるほど明確な回答は見つかりませんでした。Silverlight アプリケーションの WCF 参照を、ロード元のサイトに対して相対的に設定する必要がありますが、動作させることができません。サービス自体に問題はなく、動いています。ローカル サーバーから実サーバーに移動すると、SL アプリでエラーが発生し、localhost に接続できないというエラーが表示されます。

これが私のServiceReferences.ClientConfigファイルです:

    <configuration>
        <system.serviceModel>
            <bindings>
                <customBinding>
                    <binding name="CustomBinding_AccountManager">
                        <binaryMessageEncoding />
                        <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                    </binding>
                    <binding name="CustomBinding_FileManager">
                        <binaryMessageEncoding />
                        <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                    </binding>
                    <binding name="CustomBinding_SiteManager">
                        <binaryMessageEncoding />
                        <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                    </binding>
                </customBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost:60322/AccountManager.svc"
                    binding="customBinding" bindingConfiguration="CustomBinding_AccountManager"
                    contract="AccountManager.AccountManager" name="CustomBinding_AccountManager" />
                <endpoint address="http://localhost:60322/FileManager.svc" binding="customBinding"
                    bindingConfiguration="CustomBinding_FileManager" contract="FileManager.FileManager"
                    name="CustomBinding_FileManager" />
                <endpoint address="http://localhost:60322/SiteManager.svc" binding="customBinding"
                    bindingConfiguration="CustomBinding_SiteManager" contract="SiteManager.SiteManager"
                    name="CustomBinding_SiteManager" />
            </client>
        </system.serviceModel>
    </configuration>

はい、バッファ/メッセージ サイズ最適化します。DoS エクスプロイトの可能性はわかっています。今は忘れてください。大きなファイル転送にはそれらが必要です。私が試したアプローチは、クライアントのインスタンス化中に、次のコードを使用したことです。

    fileManager = new FileManagerClient(new BasicHttpBinding(), new EndpointAddress("http://" + Settings.Host + "/FileManager.svc"));
    accManager = new AccountManagerClient(new BasicHttpBinding(), new EndpointAddress("http://" + Settings.Host + "/AccountManager.svc"));

Settings.HostSLアプリが実行され、テストされ、機能するホストを返す独自のメソッドはどこにありますか。XAP をアップロードして試してみたところ、まだ .xap を探していました。さらに調査したところ、見えないファイルに localhost への参照http://localhost:60322/AccountManager.svcがまだたくさんあることに気付きました。

AccountManager.disco:

<?xml version="1.0" encoding="utf-8"?>
<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/">
  <contractRef ref="http://localhost:60322/AccountManager.svc?wsdl" docRef="http://localhost:60322/AccountManager.svc" xmlns="http://schemas.xmlsoap.org/disco/scl/" />
</discovery>

の部分AccountManager.wsdl: ... <wsdl:import namespace="" location="http://localhost:60322/AccountManager.svc?wsdl=wsdl0" />... ...[たくさんの操作宣言]...

<wsdl:service name="AccountManager">
    <wsdl:port name="CustomBinding_AccountManager" binding="tns:CustomBinding_AccountManager">
      <soap12:address location="http://localhost:60322/AccountManager.svc" />
      <wsa10:EndpointReference>
        <wsa10:Address>http://localhost:60322/AccountManager.svc</wsa10:Address>
      </wsa10:EndpointReference>
    </wsdl:port>
  </wsdl:service>

の一部AccountManager1.xsd:

<xs:import schemaLocation="http://localhost:60322/AccountManager.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/Leftouch.Data.Summary" />

の一部configuration.svcinfo:

<endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://localhost:60322/AccountManager.svc&quot; binding=&quot;customBinding&quot; bindingConfiguration=&quot;CustomBinding_AccountManager&quot; contract=&quot;AccountManager.AccountManager&quot; name=&quot;CustomBinding_AccountManager&quot; /&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://localhost:60322/AccountManager.svc&quot; binding=&quot;customBinding&quot; bindingConfiguration=&quot;CustomBinding_AccountManager&quot; contract=&quot;AccountManager.AccountManager&quot; name=&quot;CustomBinding_AccountManager&quot; /&gt;" contractName="AccountManager.AccountManager" name="CustomBinding_AccountManager" />

の一部Reference.svcmap:

</ClientOptions>
  <MetadataSources>
    <MetadataSource Address="http://localhost:60322/AccountManager.svc" Protocol="http" SourceId="1" />
  </MetadataSources>
  <Metadata>
    <MetadataFile FileName="AccountManager2.xsd" MetadataType="Schema" ID="e473b2d5-7af3-4390-87c3-a4fc3f54fb96" SourceId="1" SourceUrl="http://localhost:60322/AccountManager.svc?xsd=xsd2" />
    <MetadataFile FileName="AccountManager1.xsd" MetadataType="Schema" ID="fd3a1ae0-b38b-4586-8622-5b0ee07e39fb" SourceId="1" SourceUrl="http://localhost:60322/AccountManager.svc?xsd=xsd0" />
    <MetadataFile FileName="AccountManager.xsd" MetadataType="Schema" ID="6a49ee64-6eac-40e2-bcff-26418435e777" SourceId="1" SourceUrl="http://localhost:60322/AccountManager.svc?xsd=xsd1" />
    <MetadataFile FileName="AccountManager.disco" MetadataType="Disco" ID="9ec9a8cc-0cf0-4264-a526-b5a6c08f7d36" SourceId="1" SourceUrl="http://localhost:60322/AccountManager.svc?disco" />
    <MetadataFile FileName="AccountManager1.wsdl" MetadataType="Wsdl" ID="54a5b2c0-9d0e-4043-a7e4-d27ae6674bfc" SourceId="1" SourceUrl="http://localhost:60322/AccountManager.svc?wsdl=wsdl0" />
    <MetadataFile FileName="AccountManager.wsdl" MetadataType="Wsdl" ID="f8923013-3a6c-412b-b7da-bee5a5a7bb64" SourceId="1" SourceUrl="http://localhost:60322/AccountManager.svc?wsdl" />

..そして、これらすべてを他の 2 つのサービスについても繰り返します。

私は Web サービス/バインディング/エンドポイント/操作コントラクトまたは関連するもののマスターではありません。私は、(URI がハードコードされている場合) 既に完全に機能しているシステムを相対 URI で機能させたいだけです。必要なのはそれだけです。簡単な解決策があるはずです。これらのファイルの種類と宣言が正確にどのようなものであるか、どれが重要でどれがオプションであるか、またどのようにして最もクリーンな形式で動的サービス参照を作成できるかを誰かが説明できますか? 説明付きでお願いします。動的サービスのバインディングと参照に関する投稿や記事をすでにたくさん見てきましたが、正直なところ、すべてがめちゃくちゃになってしまい、何も理解できなくなります。建設的な批判と解決策は大歓迎です。

4

1 に答える 1

2

サービス (クライアントではなく) の構成ファイルは、完全修飾アドレス (クライアント構成など) を持つエンドポイントを使用していますか? その場合、これらすべての localhost 参照が表示される理由は、サービス参照を追加すると、生成されたファイルでそのアドレスが引き継がれるためです。

サービス構成ファイルのエンドポイントを更新して、そのマシンの完全修飾アドレス (つまり、http://somname.com/service.svc) を使用するか、構成ファイルの baseAddresses をマシン名に設定します。

さらに、WCF 4.0 (VS 2010/.NET 4.0) を使用している場合は、構成ファイルからエンドポイントを完全に省略することで、WCF にサービスの既定のエンドポイントを作成させることができます (私が理解しているように、現在、仕事で 4.0 に移行したばかりなので、新しい機能を試していません)。

追加するために編集

新しいアプローチ、同じ基本的な考え方 (URI がどこかからインポートされている)。以下のコメントに基づいて、サービスの構成が適切に設定されており、localhost を指すハードコードされた URI がないように思えます。

アプリケーションをターゲット サーバーに移動するとき、サービスへの参照も ([サービス参照の追加] を介して) 更新しますか? それとも、ローカル ボックスから生成されたファイルをターゲット サーバーに移動するだけですか?

もしそうなら、それがあなたの問題の原因ではないかと思います. クライアントを作成するときにサービス アドレスを指定すると、WSDL 関連ファイル内のすべてが上書きされるはずですが、そうではない可能性があります

試してみること:

<client>Web.config からセクションを削除します。次に、クライアントを作成するときは、次のようにします。

fileManager = new FileManagerClient(new BasicHttpBinding("CustomBinding_FileManager"), new EndpointAddress("http://" + Settings.Host + "/FileManager.svc"));

コンストラクターでバインディング構成セクションの名前を必ず渡してくださいBasicHttpBinding。そうしないと、指定したより大きな値ではなく、既定値でバインディングが取得されます。

ここでの考え方は、クライアント構成ファイルの設定が、FileManagerClient の作成時に渡したものを上書きする可能性を排除することです。

個々のサーバーへの展開ごとにサービス参照を更新する必要があるのは理想的ではないと思います-達成しようとしていることは理にかなっています。私が作成した n 層アプリで同様のことを行います。唯一の違いは、サービス参照を使用しないことです。SvcUtil を介してプロキシを生成し、次に を介してチャネルを生成ChannelFactory<T>します。 .

それでも問題が解決しない場合は、お気軽に私に電子メールを送信してください (私の電子メール アドレスはプロフィールに記載されています)。電子メールでやり取りして、最終的な解決策を投稿する方が簡単な場合があります。

于 2011-08-27T03:56:11.253 に答える