wcf 해당 - 기본 끝점 요소를 찾을 수 없습니다.




계약 대한 (25)

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에 복사되어 문제가되지 않습니다.

모든 단서?


Answers

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


클래스 라이브러리에서 웹 서비스를 참조하는 경우 app.config를 Windows 응용 프로그램 또는 콘솔 응용 프로그램에 복사해야합니다.

솔루션 : 변경 클래스 라이브러리의 wcf 구성과 동일한 외부 프로젝트의 구성.

나를 위해 일했다.


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

이 경우 웹 프로젝트 인 경우 winapp 또는 web.config 인 경우 기본 구성 app.config에 WS 구성 설정을 포함시켜야합니다. 이것은 PRISM 및 WPF / Silverlight를 사용하는 방법입니다.


나는이 같은 문제를 겪었다. 웹 참조의 경우 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>

터널 비전을 제거하는 데 아주 열심히 노력합니다. "오래된 프로그램에서 작동했습니다 ..."


안녕 같은 문제가 발생했는데 가장 좋은 해결책은. NET에서 클라이언트 측 구성을 구성하도록하는 것입니다. 내가 찾은 것은 http : /namespace/service.svc의 쿼리 문자열을 가진 서비스 참조를 추가 할 때 발견되는 것인가? wsdl = wsdl0 클라이언트 쪽에서 구성 끝점을 만들지 않습니다. 그러나? wsdl-wsdl0을 제거하고 URL http : /namespace/service.svc 만 사용하면 클라이언트 구성 파일에 끝점 구성이 만들어집니다. 짧은 remoe 위해 "? WSDL = WSDL0".


나는 동일한 오류가있어서 몇 가지 시도를했지만 작동하지 않았다. 내 "계약"이 전체 프로젝트에서 동일하지 않다는 것을 알았을 때, 나는 솔루션 내부의 모든 프로젝트에서 동일하게 계약을 변경했다. 이것은 프로젝트 A입니다.

<client>
    <endpoint address="https://xxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="ServiceReference.IIntegrationService" name="basic" />
</client>

프로젝트 B :

<client>
    <endpoint address="xxxxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="ServiceReference1.IIntegrationService" name="basic" />
</client>

마지막으로 나는 둘 다로 바꿨다 :

<client>
    <endpoint address="https://xxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="MyServiceReferrence.IIntegrationService" name="basic" />
</client>

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

"이 경우 웹 구성 요소가 winapp 또는 web.config 인 경우 기본 구성 app.config에 WS 구성 설정을 포함시켜야합니다. 이렇게하면 PRISM 및 WPF / Silverlight와 함께 사용할 수 있습니다."

예.하지만 주 프로젝트 (예 : Orchard 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 ...
            }

이 기사의 내용을 참조 하십시오 .


클래스 라이브러리 인터페이스를 사용함에 따라 클라이언트 UI의 App.config에 복사하는 것뿐만 아니라 바인딩 참조 이름 앞에 Service Reference의 이름을 붙여야했습니다 (내 ServiceReference 는 아래 참조).

예 :

<endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_ISchedulerService"
      contract="ServiceReference.ISchedulerService" 
      name="BasicHttpBinding_ISchedulerService" />

대신 생성 된 기본값 :

<endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_ISchedulerService"
      contract="ISchedulerService" 
      name="BasicHttpBinding_ISchedulerService" />

필자는 설정 파일에 새 설정을 추가하고 싶지 않기 때문에 (필자는 다른 사람들이 제안했듯이) 바인딩 및 엔드 포인트 주소 인스턴스를 직접 작성하여이 문제를 해결했습니다 (이는 널리 사용되는 일부 기존 라이브러리 코드를 대체합니다. 이전에는 이전의 Web Service Reference 등을 사용 했었습니다.) 그래서 새로운 설정을 사방에 추가하지 않고이 기능을 없애고 싶었습니다.

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 대신 BasicHttpsBinding 을 사용해야합니다.


나는 이런 상황을 겪었다.

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

이제 Consumer 프로젝트는 app.config의 <system.serviceModel> Tag에 관련된 모든 구성 설정을 가지고 있었지만, 위와 동일한 오류가 발생했습니다.

내가 한 모든 것은 동일한 태그 <system.serviceModel> 을 내 메인 프로젝트의 app.config 파일에 추가하고 마침내 우리는 잘 진행되었다.

내 문제의 실제 문제는 잘못된 구성 파일을 읽는 것이 었습니다. 소비자의 app.config 대신 메인 프로젝트의 설정을 언급하고있었습니다. 그걸 알아 내는데 2 시간이 걸렸습니다.


몇 가지 옵션을 테스트 한 결과,

계약 = "IMySOAPWebService"

즉, 구성에 전체 네임 스페이스가 없어도됩니다. 어떤 이유로 든 성명이 제대로 해석되지 않았습니다.


찾아야 할 한 가지를 더 추가 할 수있게하십시오. ( Tom Haigh의 대답은 이미 그것을 암시하지만 나는 명백하게하고 싶다)

web.config 파일에는 다음이 정의되어 있습니다.

<protocolMapping>
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>

한 참조에 대해 이미 basicHttpsBinding을 사용하고 있었지만 basicHttpBinding (no s)이 필요한 새 참조를 추가했습니다. 내가해야만하는 것은 그것을 내 protocolMapping 에 추가하는 것입니다.

<protocolMapping>
    <add binding="basicHttpBinding" scheme="http" />
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>

L.R. 정확하게 지적했듯이, 이것은 올바른 위치에 정의되어야합니다. 필자는 Unit Test 프로젝트의 app.config뿐만 아니라 주 서비스 프로젝트의 web.config에있는 하나를 의미했다.


클래스 파일에서 서비스를 참조하는 정신을 잃을 정도로 애매한 오류에 직면했을 때 몇 가지 응답이 올바른 해결책입니다. 서비스 구성 정보를 app.config 웹 또는 콘솔 응용 프로그램의 config.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>


나는 한 번이 문제에 직면했다. 그것은 WCF 서비스를 사용하는 인터페이스를 개발 중이기 때문입니다. 테스트 애플리케이션을 구성하고 계속 개발했습니다. 그런 다음 개발 중에 일부 서비스의 네임 스페이스를 변경했습니다. WCF 클래스와 일치하도록 web.config에서 "system.serviceModel -> client -> endpoint -> contract"를 두 번 확인했습니다. 그러면 문제가 해결됩니다.


똑같은 문제가있는 다른 사람들을 위해서. 내 서비스에 연결하려고 시도한 방식에 대한 단위 테스트를 작성했습니다. 이 같은 예외로 매번 실패했습니다. 이유는 모르겠습니다. winform에서 실행했을 때 잘 동작합니다.


서비스 클라이언트 선언 라인을 클래스 필드로 두지 말고 대신에 사용되는 각 메소드에서 인스턴스를 생성하십시오. 따라서 문제는 수정 될 것입니다. 클래스 필드로 서비스 클라이언트 인스턴스를 생성하면 디자인 타임 오류가 발생합니다!


PRISM 프레임 워크를 사용하는 WPF 응용 프로그램을 사용하는 경우 구성이 시작 프로젝트 (예 : 부트 스트 래퍼가 상주하는 프로젝트)에 있어야합니다.


해결책은 클라이언트 web.config의 끝점 이름 특성에서 끝점 이름을 제거하여 프록시에서 사용할 수있게하는 것이 었습니다.

ChannelFactory<TService> _channelFactory = new ChannelFactory<TService>("");

하루 종일 운동 만했다. 또한 초기 오류가 나타 났을 때 잘못되었지만이 수정 사항을 적용하면 계약 이름이 잘못되었습니다. 계약 이름 문자열 사람들을위한 이중 다음 트리플 체크! attrib : 이안


서비스 참조를 추가 할 때

입력중인 네임 스페이스에주의하십시오.

인터페이스의 이름에 추가해야합니다.

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" 
            contract="MyNamespace.IMySOAPWebService" />
</client>

나는 단위 테스트에서 상황을 가지고있다. app.config 파일을 단위 테스트 프로젝트에 복사했습니다. 따라서 단위 테스트 프로젝트에는 끝점 정보도 포함됩니다.


이 문제를 만들거나 수정하는 방법에는 여러 가지가있는 것 같습니다. 필자가 사용하고있는 CRM 제품은 기본 코드로 작성되었으며 .NET DLL을 호출 할 수 있지만 기본 응용 프로그램 위 / 위에 있어야하는 구성 정보가 있습니다. 나에게 CRM 애플리케이션은 .NET이 아니므로, machine.config 파일에 넣어야 만했다. 또한 회사에서 Websense를 사용하기 때문에 407 프록시 인증 필요 문제로 인해 서비스 참조를 추가하는 데 어려움을 겪었습니다. 즉, machine.cong을 수정해야했습니다.

프록시 솔루션 :

WCF 서비스 참조를 작동 시키려면 내 DLL의 app.config에서 기본 응용 프로그램 구성으로 정보를 복사해야했습니다 (그러나 machine.config의 경우). 또한 동일한 파일에 엔드 포인트 정보를 복사해야했습니다. 내가 그것을 한 후에는 나를 위해 일하기 시작했다.


설정의 네임 스페이스는 클라이언트의 기본 네임 스페이스 뒤에있는 나머지 네임 스페이스 경로 (프로젝트 속성에 구성된대로)를 반영해야합니다. 게시 된 답변을 기반으로, 내 생각에 귀하의 클라이언트가 "Fusion.DataExchange.Workflows"네임 스페이스에 있도록 구성되어 있습니다. 클라이언트 코드를 다른 네임 스페이스로 옮긴 경우 나머지 네임 스페이스 경로와 일치하도록 구성을 업데이트해야합니다.


WCF 서비스가 ASP.NET 폴더에 참조 된 .dll 파일로 ASP.NET 응용 프로그램에 추가되는 클래스 라이브러리에 추가 된 ASP.NET 응용 프로그램 내에서이 오류가 발생했습니다. 이 오류를 해결하려면 WCF 서비스를 참조하는 클래스 라이브러리 내의 app.config 파일의 구성 설정을 ASP.NET 사이트 / 응용 프로그램의 web.config 설정에 복사해야했습니다.


전역 범위 연산자없이 구성 파일 요소에서 계약을 참조 할 때이 오류가 발생했습니다.

<endpoint contract="global::MyNamepsace.IMyContract" .../>

작동하지만

<endpoint contract="MyNamepsace.IMyContract" .../>

"계약을 참조하는 기본 엔드 포인트 요소를 찾을 수 없습니다"오류를 제공합니다.

MyNamepsace.IMyContract가 포함 된 어셈블리는 기본 응용 프로그램과 다른 어셈블리에 있으므로 전역 범위 분석을 사용해야 할 필요성을 설명 할 수 있습니다.


요청에 따라 대답으로 내 의견을 복사 :

"이 속성은 binaryMessageEncodingBindingElement에만 노출되므로이 기능을 사용하려면 다음과 같은 사용자 지정 바인딩을 만들어야합니다.

<customBinding>
  <binding name="BinaryCompressionBinding"> 
    <binaryMessageEncoding compressionFormat="GZip"/> 
    <httpTransport /> 
  </binding>
</customBinding> 

압축 된 메시지를 수신하므로 클라이언트와 서비스 모두에서 compressionFormat 등록 정보를 binaryMessageEncoding 요소에 구성해야합니다. "클라이언트와 서비스 모두 전송에 동의해야합니다.







wcf .net-3.5 wcf-binding endpoint