3

途中でさまざまなサーバーに展開される WCF アプリケーションに取り組んでおり、展開するたびに app.config を変更することを忘れないようにしたいと考えています。最初、私の app.config serviceModel セクションは次のようになりました。

<system.serviceModel>  
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" />  
<behaviors>  
    <serviceBehaviors>  
        <behavior name="MyDefaultServiceBehavior">   
            <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8888/MyService" />  
            <serviceDebug includeExceptionDetailInFaults="true" />  
        </behavior>  
    </serviceBehaviors>  
</behaviors>  
<services>  
    <service behaviorConfiguration="MyDefaultServiceBehavior" name="MyService">   
        <endpoint address="net.tcp://localhost:9001/MyService" binding="netTcpBinding" contract="IMyService" name="NetTcpBinding_IMyService" />  
    </service>  
</services>  

これは、ローカル マシンで実行されているサービスにアクセスしていたときの開発では問題なく機能します。私がデプロイしたとき、WSDL にはまだ localhost を指している絶対パスが含まれていました。

<xsd:import schemaLocation=http://localhost:8888/MyService?xsd=xsd0 namespace="http://tempuri.org/" />

したがって、次のように app.config の httpGetUrl を変更できます。

<serviceMetadata httpGetEnabled="true" httpGetUrl=http://devserver1:8888/MyService />

そして今、wsdl はそのサーバー上で正しく動作します。問題は、デプロイされる各 app.config でアドレスを手動で設定する必要があることです。

次のいずれかの方法はあり
ますか?
または
2. wsdl import ステートメントで相対パスを使用しますか?

または、他の提案をいただければ幸いです。この wsdl の問題がなければ、デプロイが自動化される 2 つの開発サーバーがあります。

これはプロキシを生成するためだけのものなので、自分でプロキシを生成して配布することもできると思いますが、プロキシはユーザー自身に生成させたいと思います。

ありがとう!ダニエル

4

3 に答える 3

3

httpGetUrlの値をプログラムで設定し、サービスがホストされているサーバーのマシン名を含む絶対アドレスに設定できます。生成された WSDL のインポート ステートメントでも、サーバーのマシン名が使用されます。

WCF ホストが作成されている場合 (たとえば、IIS でホストしている場合)、カスタムServiceHostFactoryを作成してServiceHostにアクセスする必要があります。例えば:

using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Description;

namespace WebApplication
{
  public class TestServiceHostFactory : ServiceHostFactory
  {
     protected override ServiceHost CreateServiceHost(Type serviceType, 
                                                      Uri[] baseAddresses)
      {
        ServiceHost host = base.CreateServiceHost(serviceType, 
                                                  baseAddresses);
        ServiceMetadataBehavior metadataBehavior = 
                                new ServiceMetadataBehavior();
        metadataBehavior.HttpGetEnabled = true;
        metadataBehavior.HttpGetUrl = new Uri(string.Format(
                              "http://{0}/WebApplication/TestService.svc", 
                              Environment.MachineName));
        host.Description.Behaviors.Add(metadataBehavior);
        return host;
      }
  }
}

次に、サービスの .svc ファイルでこのファクトリを指定します。

<%@ ServiceHost Language="C#" 
                Service="WebApplication.TestService" 
                CodeBehind="TestService.svc.cs" 
                Factory="WebApplication.TestServiceHostFactory" %>

WCF ホストを自分で作成する場合、コードは次のようになります。

ServiceHost host = new ServiceHost(typeof(WebApplication.TestService));
ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
metadataBehavior.HttpGetEnabled = true;
metadataBehavior.HttpGetUrl = new Uri(string.Format(
                              "http://{0}/WebApplication/TestService.svc", 
                              Environment.MachineName));
host.Description.Behaviors.Add(metadataBehavior);
于 2009-02-26T22:08:55.833 に答える
2

ダニエル・リチャードソンが残した上記の答えは良いものであり、ほとんどの人にとってそれが好ましい解決策であると思います. ただし、ネットワーク レイアウトと、サーバーにアクセスする必要がある人数が少ないため、少し異なることをしています。

「myServiceServer」を含む httpGetUrl を持つように app.config を変更しました。

<serviceMetadata httpGetEnabled="true" httpGetUrl=http://myServiceServer:8888/MyService />

私のサービスを使用するには、最初に「myServiceServer」を正しい IP アドレスにマップするホスト ファイル エントリを追加する必要があります。一般的なマシン名や IP アドレスからは IP アドレスを解決できないため、これは私たちの問題ではうまく機能します。これは、ある種の NAT が進行している VPN によってのみ接続されている分離されたネットワークのためです。

于 2009-03-03T18:39:18.730 に答える
0

着信要求と同じホスト名の使用をサポートする WCF に組み込まれた非常によく隠されたオプションが明らかにありますが、これは通常正しいものです。(デフォルトではない唯一の理由は下位互換性のためだと思いますが、とにかくデフォルトにしたほうがよかったでしょう.)

この特定の宝石を見つけるまでには、多くの検索と髪の毛の引っ張りが必要でした (ただし、魔法の言葉を知ったので、私と同じような旅から来た別の答えを見つけました)。

有効にするには、次のコードを追加する場所と同じ場所に追加しますServiceMetadataBehavior

host.Description.Behaviors.Remove<UseRequestHeadersForMetadataAddressBehavior>();
host.Description.Behaviors.Add(new UseRequestHeadersForMetadataAddressBehavior());
于 2020-11-13T06:09:42.200 に答える