2009-02-25 11 views
3

途中でさまざまなサーバーにデプロイされるWCFアプリケーションで作業していますが、毎回app.configを変更する必要はありません配備Asp.net Self Hosted WCFサービス相対パスを持つWSDL

<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> 

私は私のローカルマシン上で実行されているサービスにアクセスしたとき、これは、開発に正常に動作します:まず、私のapp.configのserviceModelセクションでは、このように見えました。私はそれを展開すると、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内のアドレスを手動で設定する必要があることです。

いずれかの方法がありますか:
1.インポートがないようにwsdlにすべてのものが含まれていますか?
または
2. wsdlインポートステートメントで相対パスを使用しますか?

他の提案があれば幸いです。私は、このwsdlの問題だけではない場合、展開が自動化される2つの開発サーバーを持っています。

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

ありがとうございます! ダニエル

答えて

2

上記のDaniel Richardsonの答えは良いものですが、私はほとんどの人にとってそれが望ましい解決策だと思います。しかし、私たちのネットワークのレイアウトと私たちのサーバーにアクセスする必要がある人は少ないので、私は少し違うことをやっています。

私は自分のアプリを変更しました。「myServiceServer」が含まれていhttpGetUrl持っている設定:私のサービスを利用するに

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

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

3

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

あなたのWCFのホストがあなたのために作成されている場合(たとえば、あなたはIISの下でホスティングされている)、あなたはServiceHostへのアクセスを取得するためのカスタムServiceHostFactoryを作成する必要があります。たとえば:

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); 
+0

それは私がそれを行う方法はかなりです。 –

+1

私にとって大きな問題は、誰もがマシン名を使ってサーバーにアクセスできるわけではないということです。いくつかの人々のために、それは解決さえしません。あなたのソリューションは私の質問に対する良い答えですが、残念ながら、私は問題をあまりに単純化し、私の問題を解決しません。ソリューションについては、他のコメントを参照してください。 – Daniel

関連する問題