2013-03-13 3 views
0

웹 및 서비스 참조를 통해서만 액세스 할 수있는 타사 시스템으로 작업하고 있습니다. 자동화 된 처리를 처리하는 Windows 서비스를 구축하는 동안 솔루션에서 웹/서비스 참조를 사용하는 경우 해당 서비스를 참조하는 솔루션에서 설정해야합니다.라이브러리의 서비스 참조를 참조하지 않고 클래스 라이브러리를 참조하십시오.

이 문제를 방지 할 방법이 있습니까? 모든 실제 API 호출을 보유하고 NuGet 패키지로 사용할 모든 클래스 프로젝트에 대한 참조를 추가하지 않고도 사용할 수있는 클래스 라이브러리를 만들고 싶습니다.

편집 :는 여기에 현재 API를 호출하는 방법의 예 :

internal class ApiAccess 
{ 
    private readonly Account_SSPSoapClient _apiAccount; 

    public ApiAccess() 
    { 
     _apiAccount = new Account_SSPSoapClient(); 
    } 

    public string GetAccountId(string accountName) 
    { 
     return _apiAccount.GetID(accountName); 
    } 
} 

답변

1

이 문제이지만, 그것으로 표시되는 문제가 아니다.

코드를 사용하는 모든 프로젝트에서 실제로 서비스 참조가 필요하지 않습니다. app.config에서 필요한 정보 만 있으면됩니다. 특히, Y 인딩 및 엔드 포인트 주소. 코드에 코드를 하드 코딩하면 코드를 잘 참조 할 수 있어야합니다.

가장 간단한 경우 :

var request = new MyServiceRequest { /* set properties here */ }; 
var client = MyServiceReferenceClient(new BasicHttpBinding(), new EndpointAddress(@"https://my.service.com/path/to/service")); 
var channel = client.ChannelFactory.CreateChannel(); 
var result = channel.MyService(request); 
당신은 app.config 파일에, 그리고 URL이도 나오는 것과 일치하는 BasicHttpBinding에 대한 몇 가지 4. 기본값을 설정할 수 있습니다

.

기본적으로 작동하지 않는 이유는 this answer을 참조하십시오.


편집 : 코드를 들어, 당신은 단지의 라인을 따라 뭔가 new Account_SSPSoapClient();을 대체 할 것 :

다른
new Account_SSPSoapClient(new BasicHttpBinding(), new EndpointAddress(@"https://my.service.com/path/to/service")); 

모두가 동일하게 가야한다,하지만 대신 그 값을 사용합니다 app.config 값 (매개 변수없이 수행하는 값) 같은 대한 app.config 파일에

봐 : 그에서

<bindings> 
     <basicHttpBinding> 
      <binding name="LabelRecoveryBinding" 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> 

모든 당신이 위에서 만든 BasicHttpBinding 개체에 설정할 수있는 속성에 해당

- 그것의 대부분은 기본값입니다,하지만 당신은 할 수있다 안전을 위해 모든 것을 수동으로 설정하려고합니다.

마찬가지로, 당신은 무엇 URL입니다 new EndpointAddress에 전원을 공급하기 알려줍니다

<client> 
     <endpoint address="http://153.2.133.60:48010/xoltws_ship/LBRecovery" 
      binding="basicHttpBinding" bindingConfiguration="LabelRecoveryBinding" 
      contract="UPSLabelRecoveryService.LabelRecoveryPortType" name="LabelRecoveryPort" /> 
</client> 

를 찾습니다.

+0

약간 설명해 주시겠습니까? 해당 코드 스 니펫이 클래스 라이브러리 또는 해당 프로젝트를 참조하는 프로젝트로 이동합니까? – Logarr

+0

@Logarr - 편집 됨 - 도움이 되셨습니까? 이미 (아마도) 이미 전화를 건 것은 클래스 라이브러리에 있습니다. – Bobson

+0

아니요 ... 저는 지금 API를 호출하는 방법의 예를 보여주기 위해 질문을 편집했습니다. 나는이 경우에 당신의 방법을 적용하는 방법을 보지 못했다. – Logarr