programing

app.config에 의존하지 않고 SOAP 웹 서비스를 사용합니다.

testmans 2023. 5. 25. 21:38
반응형

app.config에 의존하지 않고 SOAP 웹 서비스를 사용합니다.

외부 웹 서비스를 호출할 .NET 구성 요소를 만들고 있습니다."Add Service Reference"(서비스 참조 추가) 대화상자를 사용하여 서비스를 사용하는 데 필요한 코드를 생성하고 app.config 파일에 설정을 추가하는 웹 서비스를 구성요소에 추가했습니다.

응용 새를 테스트하고 ... = new MyServiceSoapClient()그러나 이렇게 하면 다음과 같은 예외가 발생합니다.

잘못된 작업예외.

계약 'MyServices'를 참조하는 기본 끝점 요소를 찾을 수 없습니다.서비스 모델 클라이언트 구성 섹션에 'Soap'이 있습니다.응용 프로그램에 대한 구성 파일을 찾을 수 없거나 이 계약과 일치하는 엔드포인트 요소가 클라이언트 요소에서 찾을 수 없기 때문일 수 있습니다.

app.config가 구성 요소의 DLL과 함께 제공되지 않기 때문에 이는 타당합니다.앱의 설정에 의존하지 않고 웹 서비스를 호출하려면 어떻게 해야 합니까?구성?

<system.ServiceModel>가 외부 웹 app.config에 .service.하는 데 와 열거를 로 표현한 입니다.

예를 들어, 다음은 추가한 웹 서비스에 대해 생성된 코드입니다.

<system.serviceModel>
 <bindings>
  <basicHttpBinding>
   <binding name="MyServicesSoap" closeTimeout="00:01:00" openTimeout="00:01:00"
     receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
     bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
     useDefaultWebProxy="true">
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
       maxBytesPerRead="4096" maxNameTableCharCount="16384" />
     <security mode="None">
      <transport clientCredentialType="None" proxyCredentialType="None"
        realm="" />
      <message clientCredentialType="UserName" algorithmSuite="Default" />
     </security>
    </binding>
   </basicHttpBinding>
  </bindings>
 <client>
  <endpoint address="http://services.mycompany.com/WebServices/MyServices.asmx"
    binding="basicHttpBinding" bindingConfiguration="MyServicesSoap"
    contract="MyServices.MyServicesSoap" name="MyServicesSoap" />
 </client>
</system.serviceModel>

이는 다음과 같은 코드로 변환할 수 있습니다.

    'Set up the binding element to match the app.config settings '
    Dim binding = New BasicHttpBinding()
    binding.Name = "MyServicesSoap"
    binding.CloseTimeout = TimeSpan.FromMinutes(1)
    binding.OpenTimeout = TimeSpan.FromMinutes(1)
    binding.ReceiveTimeout = TimeSpan.FromMinutes(10)
    binding.SendTimeout = TimeSpan.FromMinutes(1)
    binding.AllowCookies = False
    binding.BypassProxyOnLocal = False
    binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard
    binding.MaxBufferSize = 65536
    binding.MaxBufferPoolSize = 524288
    binding.MessageEncoding = WSMessageEncoding.Text
    binding.TextEncoding = System.Text.Encoding.UTF8
    binding.TransferMode = TransferMode.Buffered
    binding.UseDefaultWebProxy = True

    binding.ReaderQuotas.MaxDepth = 32
    binding.ReaderQuotas.MaxStringContentLength = 8192
    binding.ReaderQuotas.MaxArrayLength = 16384
    binding.ReaderQuotas.MaxBytesPerRead = 4096
    binding.ReaderQuotas.MaxNameTableCharCount = 16384

    binding.Security.Mode = BasicHttpSecurityMode.None
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None
    binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None
    binding.Security.Transport.Realm = ""
    binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName
    binding.Security.Message.AlgorithmSuite = Security.SecurityAlgorithmSuite.Default

    'Define the endpoint address'
    Dim endpointStr = "http://services.mycompany.com/WebServices/MyServices.asmx"
    Dim endpoint = New EndpointAddress(endpointStr)
    'Instantiate the SOAP client using the binding and endpoint'
    'that were defined above'
    Dim client = New MyServicesSoapClient(binding, endpoint)

일반적으로 매개 변수 없는 생성자(즉, 매개 변수가 없는 생성자)를 사용하는 경우.new MyServicesSoapClient()됩니다.), app.config 파일의 설정이 사용됩니다. app.config 파일은 으로 설정하여 수 있습니다.binding그리고.endpoint생성자에게 인스턴스를 전달할 수 있습니다.

코드에서 바인딩끝점 구성을 설정하는 것도 한 가지 방법이지만 소비자 DLL을 사용하여 구성이 기존 App.config 파일에 유지되도록 하는 다른 방법이 있습니다.

언급된 잘못된 작업의 이유DLL에 구성 설정이 포함되어 있지 않기 때문에 예외가 발생합니다.항상 App.config를 사용하여 제공하지만 다른 콘솔 응용 프로그램에서 DLL을 사용하고 있기 때문에 구성 설정을 찾을 수 없습니다.

"Add Service Reference" 대화상자를 사용하여 클라이언트 구성요소에 웹 서비스를 추가하고 웹 서비스 인스턴스를 만들 때 Visual Studio에서 통신 채널 작성을 처리하고 구성 설정을 로드할 수 있습니다.따라서 이러한 채널을 직접 생성할 수 있다면 구성 설정을 관리할 수 있습니다.

Microsoft는 이러한 목적을 위해 클래스를 제공합니다.ConfigurationChannelFactory<TChannel>클래스는 1입니다 MSDN 상태:

특정 유형에 대한 채널 구성 요소를 만드는 일반 기능을 제공합니다.

Configuration Channel Factory를 사용하면 WCF 클라이언트 구성을 중앙에서 관리할 수 있습니다.

서비스 채널 인터페이스 인스턴스가 필요한 경우 "서비스 참조 추가" 대화상자를 사용하여 클라이언트 구성요소에 웹 서비스를 추가합니다.

먼저 생성된 App.config 파일의 이름을 App.dll.config로 변경하고 파일 속성에서 출력 디렉터리에 복사 속성항상 복사로 변경합니다.

다음과 같은 웹 서비스에 액세스하기 위해 Channel 개체를 반환하는 메서드가 있는 클래스를 만듭니다.

public class ManageService
{
    public static T CreateServiceClient<T>(string configName)
    {
        string _assemblyLocation = Assembly.GetExecutingAssembly().Location;
        var PluginConfig = ConfigurationManager.OpenExeConfiguration(_assemblyLocation);
        ConfigurationChannelFactory<T> channelFactory = new ConfigurationChannelFactory<T>(configName, PluginConfig, null);
        var client = channelFactory.CreateChannel();
        return client;
    }
}

Copy Always VS 속성을 설정했으므로 Project DLL과 App.dll.config를 bin 폴더에 복사합니다. Assembly.GetExecutingAssembly().Location어셈블리 위치를 반환합니다.ConfigurationManager.OpenExeConfiguration

지정한 클라이언트 구성 파일을 구성 개체로 엽니다.

PluginConfig앱을 보유합니다.구성 파일 개체 및ConfigurationChannelFactory<T>서비스와 통신하는 데 사용합니다.

이 메서드는 다음과 같이 서비스 채널 인터페이스 개체를 전달하여 호출할 수 있습니다.

Client = ManageService.CreateServiceClient<SampleService.IKeyServiceChannel>("MetadataExchangeTcpBinding_IKeyService"); 

SampleService웹 서비스의 네임스페이스입니다. Client웹 서비스의 인스턴스를 보유합니다.

이중 통신 및 콜백을 처리해야 하는 경우 다음을 확인할 수 있습니다.ConfigurationDuplexChannelFactory<TChannel>학급.

만약 이것이 WCF 서비스라면(오류 메시지에서 보듯), 대부분의 경우 당신은 app.config가 필요할 것입니다. 왜냐하면 MyServiceSoapClient가 웹 서비스라는 것을 WCF의 나머지 부분에 알려주는 app.config이기 때문입니다(두 개의 app.config 파일에 약간의 변경이 있으면).config 파일은 명명된 파이프 서비스가 될 수 있습니다.코드를 다시 컴파일하지 않고...)

이제 app.config 없이 이 작업을 수행하려면 생성된 파일을 던져야 합니다.MyServiceSoapClient()그리고 당신 자신의 것을 쓰세요, 기초로.HttpWebRequest.

언급URL : https://stackoverflow.com/questions/3703844/consume-a-soap-web-service-without-relying-on-the-app-config

반응형