2011-07-28 13 views
7

LAN上で正常に動作するWCFサービスがありますが、サービス参照外でアクセスしようとすると失敗します。WCFがIPアドレスの代わりにコンピュータ名を使用しているため、解決できません。

私のWCFサービスは、静的IPなしドメインを使用しているwin2k3ボックスでホストされています。

+1

、サービスが他のポートを使用していて、ルータのファイアウォールがこれらのポートへの外部アクセスをブロックしている可能性はありますか? – Tod

+0

ファイアウォールは問題ありません。コンピュータ名はLAN経由では解決できませんでしたが、解決策があります。とにかくThnx。 – baileyswalk

答えて

2

掘り下げた後、私はこれに対する答えを見つけました。ここで私はうまくいけば、誰か他の人を救うことができ、迷惑をかけることがあります。

1)そのように、ベースIPアドレスとホスト名を追加するエンドポイントアドレス&にIPを追加します。

<endpoint 
    address="http://xx.xx.xx.xx/ServiceApp/Service.svc" 
    binding="basicHttpBinding" contract="IService"> 
</endpoint> 
<host> 
    <baseAddresses> 
    <add baseAddress="http://xx.xx.xx.xx/ServiceApp/" /> 
    </baseAddresses> 
</host> 

これは私のサービス参照を動作させるのに十分でするために使用されるが、ディスコファイルが開始ipの代わりにコンピュータ名で返されています(これは.NET 4.0にアップデートした後でした)。

2.)ドメイン名(www.myDomain.com)を持っている場合は、これをIISのホストヘッダーに追加します。

3)しかし、彼らのホストファイル)

4)BEST SOLUTIONにこれを追加するには、すべてのクライアントを取得しないように、常に(クライアントのhostsファイルに可能な簡単な修正をIPアドレス&コンピュータ名を追加します。私はここで、「Timetheos」ポストごとにServiceHosts factory属性を実装することがわかった:私はローカル&デバッグ私のサービスライブラリを開発し、テストしてから、私にサービスを展開するサービスのアプリを使用することができますようhttp://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c7fd51a2-773e-41d4-95a0-244e925597fe

は、これは私のためによく働きましたdevサーバーを公開した後、構成ファイルを変更する必要はありませんでした。

このプロセス全体が悪夢であったため、誰もが望んでいないので、同じ状況にあり、上記の点に関する情報が必要な場合は、すぐに連絡してください。

+0

こんにちはbaileyswalk、 私はIPアドレスに変更すると、それは私にユーザー名とパスワードを尋ねます。そして、私はそれが接続していないことを提供します。 –

14

これは私のために働いたものです。設定ファイル内

< serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel > 

falseに設定すると、狂ったコンピュータ名の置換を取得していました。

multipleSiteBindingsEnabled="true"私はこれがすべきこととして動作するために必要なすべてのようです。

+0

これはWindows Server 2012で私のために働いていました。 – skjoshi

+0

ありがとう、問題 –

+0

次に、サービスエンドポイントに相対サービスアドレスが必要です。 –

0

このようにサービスエンドポイントとhttpgeturlを設定します。

<services> 
    <service behaviorConfiguration="serviceBehaviour" name="Demo.Service.MultiEndPointsService"> 
     <endpoint address="http://192.168.1.2/Demo.Service/MultiEndPointsService.svc/basic" binding="basicHttpBinding" bindingConfiguration="basicBinding"  contract="Demo.Service.MultiEndPointsService" /> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
     <behavior name="serviceBehaviour"> 
      <serviceMetadata httpGetEnabled="true" httpGetUrl="http://192.168.1.2/Demo.Service/MultiEndPointsService.svc/basic"/>  
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
4

私はHTTPリクエストからHostヘッダーを再利用する方法を検討していました。私の意見では、これは開発段階での生産と同様に機能するはずです。

<behaviors> 
    <serviceBehaviors> 
     <behavior name="..."> 
     ... 
     <useRequestHeadersForMetadataAddress /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

WSDLのエンドポイントは、クライアントからアクセス可能である場合は、この方法では、これは、関連するすべてのWSDL/XSDリソースが同じベースURLでアクセス可能であることを保証します:それは結局のところ

はほど簡単です。

あなたがそうのようなベースURLのlocalhostまたはマシン名の代わりにアスタリスク*(ワイルドカード)を使用することができます
+0

ありがとうこれは私のために働いた –

1

:それはローカルで動作し、WSDLは、ポート80のWebページ上に表示された場合

<add baseAddress="net.tcp://*:4502/WxWcfService_01" />