[wcf] 기본 엔드 포인트 요소를 찾을 수 없습니다

VS2008 / .NET 3.5 솔루션의 웹 서비스에 프록시를 추가했습니다. 클라이언트 .NET을 구성 할 때이 오류가 발생합니다.

ServiceModel 클라이언트 구성 섹션에서 계약 ‘IMySOAPWebService’를 참조하는 기본 엔드 포인트 요소를 찾을 수 없습니다. 애플리케이션에 대한 구성 파일이 없거나 클라이언트 요소에서이 계약과 일치하는 엔드 포인트 요소가 없기 때문일 수 있습니다.

이 오류를 검색하면 계약에서 전체 네임 스페이스를 사용하라는 메시지가 나타납니다. 전체 네임 스페이스가있는 app.config는 다음과 같습니다.

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" bindingConfiguration="IMySOAPWebServicebinding"
            contract="Fusion.DataExchange.Workflows.IMySOAPWebService" name="IMySOAPWebServicePort" />
</client>

XP 로컬을 실행 중입니다 (많은 Google 적중이 win2k3을 언급했기 때문에 이것을 언급했습니다) .app.config가 app.exe.config에 복사되므로 문제가되지 않습니다.

단서가 있습니까?



답변

“이 오류는 클래스 라이브러리에서 서비스를 호출하고 다른 프로젝트에서 클래스 라이브러리를 호출하는 경우 발생할 수 있습니다.”

이 경우 winapp 인 경우 기본 프로젝트 app.config 또는 웹앱 인 경우 web.config에 WS 구성 설정을 포함해야합니다. 이것이 PRISM 및 WPF / Silverlight에서도 가능합니다.


답변

바인딩 및 엔드 포인트 주소 인스턴스를 직접 만들어서이 문제를 해결했습니다 (다른 사람들이 제안한 것처럼 생각합니다). 설정 파일에 새 설정을 추가하고 싶지 않기 때문에 (이것은 널리 사용되는 기존 라이브러리 코드를 대체합니다. 이전에는 이전 웹 서비스 참조 등을 사용 했으므로 새 구성 설정을 어디에나 추가하지 않고도이 기능을 추가 할 수 있기를 원했습니다.

var remoteAddress = new System.ServiceModel.EndpointAddress(_webServiceUrl);

using (var productService = new ProductClient(new System.ServiceModel.BasicHttpBinding(), remoteAddress))
{
    //set timeout
    productService.Endpoint.Binding.SendTimeout = new TimeSpan(0,0,0,_webServiceTimeout);

    //call web service method
    productResponse = productService.GetProducts();
} 

편집하다

https를 사용 BasicHttpsBinding하는 경우 대신 을 사용해야 BasicHttpBinding합니다.


답변

몇 가지 옵션을 테스트 한 결과 마침내이를 사용하여이 문제를 해결했습니다.

contract = “IMySOAPWebService”

즉, 구성에 전체 네임 스페이스가 없습니다. 어떤 이유로 전체 이름이 제대로 확인되지 않았습니다


답변

나는이 같은 문제가 있었다. 웹 참조의 경우 생성자에 첫 번째 매개 변수로 URL을 제공해야합니다.

new WebService.WebServiceSoapClient("http://myservice.com/moo.aspx");

새로운 스타일의 웹 서비스 참조의 경우 구성에서 엔드 포인트 항목을 나타내는 이름을 제공해야합니다.

new WebService.WebServiceSoapClient("WebServiceEndpoint");

에 해당하는 항목으로 Web.config또는 App.config:

<client>
      <endpoint address="http://myservice.com/moo.aspx"
        binding="basicHttpBinding"
        bindingConfiguration="WebService"
        contract="WebService.WebServiceSoap"
        name="WebServiceEndpoint" />
    </client>
  </system.serviceModel>

“이전 프로그램에서 작동했습니다”에 대한 터널 비전을 제거하기가 매우 어렵습니다 …


답변

나는 이런 상황을 겪었다.

  • 어딘가에서 호스팅되는 WCF 서비스
  • 주요 프로젝트
  • WCF 서비스에 대한 서비스 참조가있는 ‘클래스 라이브러리’유형의 소비자 프로젝트
  • 주요 프로젝트는 소비자 프로젝트의 메소드를 호출

이제 소비자 프로젝트는 모든 관련 구성 설정을 <system.serviceModel> app.config의 Tag에 이 있었으며 여전히 위와 동일한 오류가 발생했습니다.

내가 한 모든 <system.serviceModel>것은 내 주요 프로젝트의 app.config 파일에 동일한 태그 를 추가 하고 마지막으로 우리는 갈 수있었습니다.

필자의 경우 실제 문제는 잘못된 구성 파일을 읽는 것입니다. 소비자의 app.config 대신 기본 proj의 구성을 참조했습니다. 그것을 알아내는 데 2 ​​시간이 걸렸습니다.


답변

“이 오류는 클래스 라이브러리에서 서비스를 호출하고 다른 프로젝트에서 클래스 라이브러리를 호출하는 경우 발생할 수 있습니다.”

“이 경우 winapp 인 경우 기본 프로젝트 app.config에 웹 구성 인 경우 web.config 인 WS 프로젝트 설정에 WS 구성 설정을 포함해야합니다. 이는 PRISM 및 WPF / Silverlight에서도 사용할 수있는 방법입니다.”

예. 그러나 주 프로젝트 (예 : 오차드 CMS)를 변경할 수없는 경우 프로젝트에서 WCF 서비스 구성을 유지할 수 있습니다.

클라이언트 생성 방법으로 서비스 헬퍼를 작성해야합니다.

public static class ServiceClientHelper
{
    public static T GetClient<T>(string moduleName) where T : IClientChannel
    {
        var channelType = typeof(T);
        var contractType = channelType.GetInterfaces().First(i => i.Namespace == channelType.Namespace);
        var contractAttribute = contractType.GetCustomAttributes(typeof(ServiceContractAttribute), false).First() as ServiceContractAttribute;

        if (contractAttribute == null)
            throw new Exception("contractAttribute not configured");

        //path to your lib app.config (mark as "Copy Always" in properties)
        var configPath = HostingEnvironment.MapPath(String.Format("~/Modules/{0}/bin/{0}.dll.config", moduleName));

        var configuration = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = configPath }, ConfigurationUserLevel.None);
        var serviceModelSectionGroup = ServiceModelSectionGroup.GetSectionGroup(configuration);

        if (serviceModelSectionGroup == null)
            throw new Exception("serviceModelSectionGroup not configured");

        var endpoint = serviceModelSectionGroup.Client.Endpoints.OfType<ChannelEndpointElement>().First(e => e.Contract == contractAttribute.ConfigurationName);
        var channelFactory = new ConfigurationChannelFactory<T>(endpoint.Name, configuration, null);
        var client = channelFactory.CreateChannel();
        return client;
    }
}

그것을 사용하십시오 :

using (var client = ServiceClientHelper.GetClient<IDefaultNameServiceChannel>(yourLibName)) {
                ... get data from service ...
            }

이 기사의 세부 사항을 참조 하십시오 .


답변

클래스 파일에서 서비스를 참조하는 마음이 모호하게 모호한 오류에 직면했을 때 여기에 몇 가지 응답이 올바른 솔루션에 부딪 쳤습니다. 서비스 구성 정보를 콘솔 또는 Windows 앱의 app.config web.config에 복사하십시오. 그 대답 중 어느 것도 당신에게 무엇을 복사 해야하는지 보여주지 않는 것 같습니다. 그것을 시도하고 수정합시다.

다음은 “TranslationServiceOutbound”라는 서비스에 대한이 미친 오류를 해결하기 위해 클래스 라이브러리의 구성 파일에서 콘솔 앱의 구성 파일로 복사 한 내용입니다.

기본적으로 system.serviceModel 섹션 내부의 모든 것을 원합니다 .

  <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_ITranslationServiceOutbound" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://MyHostName/TranslationServiceOutbound/TranslationServiceOutbound.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITranslationServiceOutbound"
    contract="TranslationService.ITranslationServiceOutbound" name="BasicHttpBinding_ITranslationServiceOutbound" />
</client>