wcf - 해당 계약 에 대한 끝점 구성 이 두 개 이상 이므로




기본 끝점 요소를 찾을 수 없습니다. (20)

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

"이 경우 웹 구성 요소가 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 ...
            }

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

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 또는 web.config 인 경우 기본 구성 app.config에 WS 구성 설정을 포함시켜야합니다. 이것은 PRISM 및 WPF / Silverlight를 사용하는 방법입니다.


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


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


나는 동일한 문제가있다. 나는 클래스 라이브러리에서 WCF 서비스를 사용했고 윈도우 애플리케이션 프로젝트에서 클래스 라이브러리를 호출했다.하지만 나는 잊어 버렸다. <system.serviceModel> Windows 애플리케이션의 구성 파일에서 프로젝트 <system.serviceModel> 클래스 라이브러리의 app.Config 파일.
솔루션 : 변경 클래스 라이브러리의 wcf 구성과 동일한 외부 프로젝트의 구성.


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

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


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

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


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


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

계약 = "IMySOAPWebService"

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


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


서비스를 사용하는 라이브러리 이외의 응용 프로그램을 테스트하면이 문제가 발생할 수 있습니다.

다른 사람들이 입력 한 정보는이 문제의 근본 원인을 다룹니다. 자동화 된 테스트 케이스를 작성하려고하는데 테스트중인 유닛이 실제로 서비스 인터페이스를 호출 할 경우 테스트 프로젝트에 서비스 참조를 추가해야합니다. 이것은 라이브러리 유형의 오류를 사용하는 응용 프로그램의 맛입니다. 나는 인터페이스를 사용하는 코드가 라이브러리에 없기 때문에 이것을 즉시 인식하지 못했다. 그러나 실제로 테스트가 실행되면 테스트중인 어셈블리가 아닌 테스트 어셈블리에서 실행됩니다.

단위 테스트 프로젝트에 서비스 참조를 추가하면 내 문제가 해결되었습니다.


승인. 내 사건은 조금 다르지만 마침내 나는 그것에 대한 수정을 발견했다. Console.EXE -> DLL -> WS1 -> DLL 호출 -> WS2 호출

WS1의 서비스 모델과 WS2의 두 가지 구성을 모두 Console.EXE.config에 포함 시켰습니다. - 문제를 해결하지 못했습니다.

그러나 실제로 WS2WebReference를 WS1에 추가하기 전까지는 실제로 작동하지 않았습니다. 실제로 WS2의 프록시를 만들고 호출하는 DLL 뿐만이 아닙니다.


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


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


이 하나가 나를 미치게 만들었다.

Silverlight 3 프리즘 (CAB)을 WCF와 함께 사용하고 있습니다.

프리즘 모듈에서 WCF 서비스를 호출하면 같은 오류가 발생합니다.

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

Shell의 .xap 파일에서 ServiceReferences.ClientConfig 파일을 찾고 모듈의 ServiceReferences.ClientConfig 파일을 찾지 못한 것으로 나타났습니다. 내 종점을 추가하고 Silverlight Shell 응용 프로그램 (기존 WCF 서비스라고 함)의 기존 ServiceReferences.ClientConfig 파일에 바인딩합니다.

그런 다음 웹 프로젝트의 ClientBin 폴더에 대한 .xap 파일을 새로 생성하기 위해 Shell 응용 프로그램을 다시 빌드해야했습니다.

이제이 코드 라인이 마침내 작동합니다.

MyServiceClient myService = new MyServiceClient();

찾아야 할 한 가지를 더 추가 할 수있게하십시오. ( 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에있는 하나를 의미했다.


클래스 라이브러리 인터페이스를 사용함에 따라 클라이언트 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" />

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


필자는 설정 파일에 새 설정을 추가하고 싶지 않기 때문에 (필자는 다른 사람들이 제안했듯이) 바인딩 및 엔드 포인트 주소 인스턴스를 직접 작성하여이 문제를 해결했습니다 (이는 널리 사용되는 일부 기존 라이브러리 코드를 대체합니다. 이전에는 이전의 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 을 사용해야합니다.





endpoint