0

次のように、コードで servicereferences.clientconfig ファイルからエンドポイントを読み取ろうとしています。

public BaseRepository()
    {
        _proxy = new MyServiceClient("BasicHttpBinding_IMyService");
        this.binding = (BasicHttpBinding)_proxy.Endpoint.Binding;
        this.endpoint = _proxy.Endpoint.Address;
    }

ここで、「BasicHttpBinding_IMyService」は、Servicereferences.ClientConfig で定義されているエンドポイントの名前です。

<configuration>
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IMyService" maxBufferSize="2147483647"
                maxReceivedMessageSize="2147483647">
                <security mode="Transport" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>

        <endpoint address="https://xxx/myservice.svc?wsdl"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyService"
            contract="IMyserviceContract" name="BasicHttpBinding_IMyService" />
    </client>


</system.serviceModel>

ローカルで実行すると問題なく動作しますが、サーバーにデプロイすると動作しません。何か不足していますか?

4

2 に答える 2

0

構成からエンドポイント構成を読み取るたびに、サービス参照の追加中に行ったすべてのデフォルト設定が使用されます。デフォルト設定には、以下のような URI が含まれています。

<binding name="BasicHttpBinding_IWorkbenchService1" maxBufferSize="2147483647"
                maxReceivedMessageSize="2147483647">
                <security mode="None" />
            </binding>

上記の構成では、ローカル サーバーを URI として使用するため、ローカル マシンでのみ実行できます。

これを他のサーバーにデプロイする場合は、サーバーを見つけるために正しい URI を指定する必要があります。これは、プロキシの作成中に以下のコードを含めることで実行できます。

Uri uri = null;
                if (!System.ComponentModel.DesignerProperties.IsInDesignTool)
                {
                    hostName = HtmlPage.Document.DocumentUri.Host;
                    portNo = HtmlPage.Document.DocumentUri.Port;
                    if (hostName == "localhost")
                    {

                        uri = new Uri("http://localhost:2700/xyz.svc");

                    }
                    else
                    {
                        uri = new Uri("http://" + hostName + ":" + portNo.ToString() + "/WebService/xyz.svc");
                    }
                }
                else
                {
                    uri = new Uri("http://localhost:2700/xyz.svc");
                }

                _proxy = new xyzClient(binding, new EndpointAddress(uri));
                _proxy.Endpoint.Binding.CloseTimeout = new TimeSpan(01, 20, 10);
                _proxy.Endpoint.Binding.ReceiveTimeout = new TimeSpan(01, 20, 10);
                _proxy.Endpoint.Binding.SendTimeout = new TimeSpan(01, 20, 10);
                _proxy.Endpoint.Binding.OpenTimeout = new TimeSpan(01, 20, 10);

                return _proxy;
            }

これがあなたの質問に答えることを願っています。

于 2013-02-14T09:13:50.277 に答える
0

あなたのサーバーは Https SSL で保護されたサーバーだと思います。

その場合は、コードを少し変更して解決する必要があります。

あなたのバインディングにはEndpointAddressがあり、私が覚えているように、その上にProtocolプロパティがあり、それは"http"または"https"です。

その https バインディングにSecurityModeオプションがある場合は、 SSL が使用するトランスポートとして設定する必要があります。

他のシナリオでは、web.config でトレースを開く必要があります

 <configuration>
 <system.diagnostics>
  <sources>
        <source name="System.ServiceModel" 
                switchValue="Information, ActivityTracing"
                propagateActivity="true">
        <listeners>
           <add name="traceListener" 
               type="System.Diagnostics.XmlWriterTraceListener" 
               initializeData= "c:\log\Traces.svclog" />
        </listeners>
     </source>
  </sources>

次に、サービスを呼び出して、c:\log\Traces.svclogSvcTraceViewer.exeで開き、 赤のログを調べます。

希望が役立ちます!

于 2013-02-13T06:49:05.537 に答える