2010-04-19 8 views
5

그래서 현재 솔루션에 Service References로 2 개의 WSDL이 추가되었습니다. (그것이 재미 있기 때문에, 나는 "바인딩"필드를 제거) 그들은 내 app.config 파일에 다음과 같이 :런타임시 WSDL EndPointAddress의 주소/포트를 변경 하시겠습니까?

using (DataService.DataClient dClient = new DataService.DataClient()) 
{ 
    DataService.importTask impt = new DataService.importTask(); 
    impt.String_1 = "someData"; 
    DataService.importResponse imptr = dClient.importTask(impt); 
} 

: 나는 WSDL을 이용하면

<system.serviceModel> 
    <client> 
    <endpoint address="http://localhost:8080/query-service/jse" binding="basicHttpBinding" bindingConfiguration="QueryBinding" contract="QueryService.Query" name="QueryPort" /> 
    <endpoint address="http://localhost:8080/dataimport-service/jse" binding="basicHttpBinding" bindingConfiguration="DataImportBinding" contract="DataService.DataImport" name="DataImportPort" /> 
    </client> 
</system.serviceModel> 

, 그것은 다음과 같이 보입니다 "using"문에서 DataClient 객체를 인스턴스화 할 때 5 개의 생성자를 사용할 수 있습니다. 내가의 app.config에서 가져온 것으로 가정 엔드 포인트 내장 된 주소 문자열을 사용

new DataService.DataClient() 

이 시나리오에서는, 나는 기본 생성자를 사용합니다. 하지만이 값을 변경할 수있는 옵션을 응용 프로그램 사용자가 갖고 싶어.

1) 프로그래밍 방식으로이 문자열을 얻는 가장 좋은 방법은 무엇입니까?

2) 그런 다음 사용자가 값을 편집하고 테스트하도록 허용 한 후에는 어디에 저장해야합니까?

값이 존재하는지 여부와 대체 생성자를 사용해야하는지 여부를 확인할 필요가 없도록 app.config 또는 이와 비슷한 위치에 저장하는 것이 더 좋습니다. (내 코드가 꽉 유지 찾고, 나중에 알지?)

어떤 아이디어? 제안?

편집 아마 나뿐만 아니라 이러한 대체 생성자에 대해 요청해야합니다.

new DataService.DataClient(string endPointConfigurationName, 
           string remoteAddress) 

무엇 값은 "endPointConfigurationName"와 "remoteAddress"를 전달받을 수 있습니다 : 예를 들어

는, 그 중 하나는 다음과 같다? 여기에 내 자신의 질문에 대답

EDIT2

는 "endPointConfigurationName"는 "엔드 포인트 주소와 동일한 포맷 된의 app.config의 XML의"이름 "과"remoteAddress "와 동일하게 나타납니다 "app.config XML에서.

또한!

ClientSection clSection = 
    ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection; 

ChannelEndpointElementCollection endpointCollection = 
    clSection.ElementInformation.Properties[string.Empty].Value as ChannelEndpointElementCollection; 

Dictionary<string, string> nameAddressDictionary = 
    new Dictionary<string, string>(); 

foreach (ChannelEndpointElement endpointElement in endpointCollection) 
{ 
    nameAddressDictionary.Add(endpointElement.Name, 
          endpointElement.Address.ToString()); 
} 

EDIT3

좋아, 내 문제를 내가 (따라서 전체 솔루션 등) 하반기을 알아 냈어요 생각하십시오 EndPointAddresses보기에 대한 내 첫 번째 질문에 대한 답은 다음이다 . 나는 다른 웹 사이트에이를 발견하고 내 요구를 충족하기 위해이를 수정 :

Configuration configuration; 
ServiceModelSectionGroup serviceModelSectionGroup; 
ClientSection clientSection; 

configuration = 
    ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
serviceModelSectionGroup = 
    ServiceModelSectionGroup.GetSectionGroup(configuration); 
clientSection = serviceModelSectionGroup.Client; 

foreach (ChannelEndpointElement endPt in clientSection.Endpoints) 
{ 
    MessageBox.Show(endPt.Name + " = " + endPt.Address); 
} 
configuration.Save(); 

를이 코드와 함께, 우리는 clientSection.Endpoints에 액세스 할 수 있으며 "주소"와 같은, 액세스 및 모든 구성원 속성을 변경할 수 있습니다. 그런 다음 변경을 완료하면 구성을 수행 할 수 있습니다 .Save() 및 모든 값은 사용자 파일에 기록됩니다.

이제 잡을 수 있습니다.디버그 모드에서 "configuration.save()"는 실행에서 실행까지 실제로 값을 유지하는 것처럼 보이지 않지만 응용 프로그램 정상 모드 (디버그 모드 외부)를 실행하면 값이 유지됩니다. (이것은 좋은 것입니다.) 이것이 유일한주의 사항입니다.

EDIT4

다른주의가있다. WSDL에 대한 변경 사항은 런타임 중에 적용되지 않습니다. 응용 프로그램이 메모리에 사용자 설정 파일의 값을 다시 읽고 다시 시작해야합니다 (분명히).


내가 관심이있을 수있는 유일한 다른 것은 방법을 찾는에서 (값을 변경 한 후) 값을 기본값으로 되돌립니다. 물론 사용자 파일을 삭제할 수는 있지만 모든 사용자 정의 설정이 삭제됩니다.

아이디어가 있으십니까?

EDIT5

내가 생각하고 의존성 삽입은 여기에 완벽하지만, 그것을 더 연구 할 필요가 ...

편집 6

나는 당신에게 코멘트 권한이 있지만없는 수 변경 내용이 즉시 일어날 수 있도록

ConfigurationManager.RefreshSection("client"); 

가 캐시를 갱신 한 것으로 실행해야합니다.

답변

2

웹 참조을 사용하여 서비스 참조를 만들면 프로그래밍 방식으로 연결을 변경하는 데 어려움이있을 수 있습니다. 자동 생성 된 코드를 변경 한 경우에도 업데이트 서비스 참조을 작성하자마자 덮어 씁니다.

Microsoft의 자동 생성 코드를 스크래치하고 자신 만의 WCF 클래스를 만드는 것이 가장 좋습니다. 그것은 어렵지 않으며, 많은 유연성/확장 성을 제공합니다.

Here's an excellent article 매우이 주제에.

사용자 지정 주소를 저장하는 방법은 Silverlight, Windows 또는 웹 응용 프로그램인지 여부에 따라 달라집니다. 내 개인적인 선택은 데이터베이스입니다.

+0

나는이 기사를 다시 읽게 될 것이다. (내 눈이 기사의 중간에 윤곽을 그리기 시작했다.) 그러나 나는 동의하지 않을 것이다. 그것은 꽤 어렵다. 특히 이러한 WSDL이 무엇을 해야할지 거의 알지 못한다고 생각하면됩니다. 결국 WSDL을 최대 22 개까지 통합 할 수 있습니다. "Add Service Reference"는 훌륭한 마법이었습니다. 제한하고는 있지만, 내 프로젝트가 빨리 진행된다는 점에서 훌륭합니다. (어쨌든 +1을 해줄 것입니다. 좋은 찾기이므로 고마워요!) – Pretzel

+0

예, 게으른 프로그래머처럼 들립니다. 어느 정도까지는 우리 모두가 아닌가? :-) 나는 이것에 관해 더 많은 장면을 찍을 것을 맹세한다. 그러나 토목 공학과 건축학 학위를 받고자하는 것처럼 보인다. 단지 뒷마당에 판잣집을 세우는 것 같다. 그래, 알아? – Pretzel

+0

@Pretzel - 좋은 슬픔, 22 개의 참고 사항! 이 경우 과거에 사용한 적이있는 빠르고 더러운 솔루션이 있습니다. 부분 수업을 활용 해보십시오. 이 아이디어는 자동으로 생성 된 클래스에 대한 부분 클래스이므로 서비스 참조 업데이트에서 코드를 잃지는 않습니다. 어느 쪽이든 당신은 교차로에있어. Microsoft에서 생성 한 코드를 배우고 해부하거나 직접 작성하십시오. 오해하기 쉬운 정보는 – Matt

관련 문제