1

Windows サービスから Web サービスを呼び出しています。Web サービスが参照され、エラーや警告なしですべてがコンパイルされます。Web サービスからメソッドを呼び出すと、以下に示すエラーが表示されます。

    Nie można odnaleźć elementu punktu końcowego o nazwie „WSHttpBinding_IWebService” i kontrakcie „RemoteServiceLancerto.IWebService” w sekcji konfiguracji klienta ServiceModel. Może to być spowodowane tym, że nie znaleziono pliku konfiguracji dla używanej aplikacji lub tym, że w elemencie klienta nie znaleziono elementu punktu końcowego pasującego do tej nazwy.
   w System.ServiceModel.Description.ConfigLoader.LoadChannelBehaviors(ServiceEndpoint serviceEndpoint, String configurationName)
   w System.ServiceModel.ChannelFactory.ApplyConfiguration(String configurationName, Configuration configuration)
   w System.ServiceModel.ChannelFactory.ApplyConfiguration(String configurationName)
   w System.ServiceModel.ChannelFactory.InitializeEndpoint(String configurationName, EndpointAddress address)
   w System.ServiceModel.ChannelFactory`1..ctor(String endpointConfigurationName, EndpointAddress remoteAddress)
   w System.ServiceModel.ConfigurationEndpointTrait`1.CreateSimplexFactory()
   w System.ServiceModel.ConfigurationEndpointTrait`1.CreateChannelFactory()
   w System.ServiceModel.ClientBase`1.CreateChannelFactoryRef(EndpointTrait`1 endpointTrait)
   w System.ServiceModel.ClientBase`1.InitializeChannelFactoryRef()
   w System.ServiceModel.ClientBase`1..ctor(String endpointConfigurationName, String remoteAddress)
   w CreativiumCounterService.DatabaseSync.getWebService() w d:\Projekty\Liczniki\CreativiumCounterService\DatabaseSync.cs:wiersz 144
   w CreativiumCounterService.DatabaseSync..ctor() w d:\Projekty\Liczniki\CreativiumCounterService\DatabaseSync.cs:wiersz 30
   w CreativiumCounterService.DatabaseSync.get_Instance() w d:\Projekty\Liczniki\CreativiumCounterService\DatabaseSync.cs:wiersz 49
   w CreativiumCounterService.CounterService.syncronizerWorker(Object sender, ElapsedEventArgs e) w d:\Projekty\Liczniki\CreativiumCounterService\CreativiumCounterService.cs:wiersz 0

私のクライアント(Windowsサービス)のapp.configを見たいと思うかもしれないので、以下に示します。

<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_IWebService">
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="None" />
        <message clientCredentialType="UserName" />
      </security>

    </binding>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint address="https://domain.domain.com/Service/Service.svc"
    binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IWebService"
    contract="RemoteServiceLancerto.IWebService" name="WSHttpBinding_IWebService" />
</client>

<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="True"/>

    </behavior>
  </serviceBehaviors>
</behaviors>

確かに、これは Web サービス アドレスが変更された構成 (Web サービス部分) の一部にすぎません。

以下は、Web サービス (RSL として参照される) を取得するための私の方法です。

public RSL.WebServiceClient getWebService()
        {
            PreciousData details = PreciousData.deserialize();
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(IgnoreCertificateErrorHandler);
            String ConnectionString = details.getWebServiceConnectionString();

            RSL.WebServiceClient client = new RemoteServiceLancerto.WebServiceClient("WSHttpBinding_IWebService", ConnectionString);

            client.ClientCredentials.UserName.UserName = details.getWebServiceLogin();
            client.ClientCredentials.UserName.Password = details.getWebServicePassword();


client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
            return client;
        }

現時点では、IgnoreCertificateErrorHandler に証明書の検証はありませんが、以下に示します。

 public bool IgnoreCertificateErrorHandler(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
            System.Security.Cryptography.X509Certificates.X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        }

さらに、カジュアルな WinForms アプリで Web サービスを参照し、同じコードを使用して Web サービスからメソッドを呼び出すと、機能します。詳細が必要な場合は、提供できます。Web サービスに移行してから問題が発生する前に、Web サービスをテストしたことを言及しておく必要があります。ほとんど忘れてしまいました。System.Timers.Timer の経過イベントから Web サービスを呼び出します。

4

1 に答える 1