이는 HTTP 프로토콜을 사용하지 않는 서비스 엔드 포인트 바인딩 때문일 수 있습니다.


87

내 로컬 컴퓨터에서 WCF 서비스가 제대로 실행되고 있습니다. 서버에 저장했는데 다음과 같은 오류가 발생합니다.

http : //xx.xx.x.xx : 8200 / Services / WCFClient.svc에 대한 HTTP 응답을 수신하는 중에 오류가 발생했습니다 . 이는 HTTP 프로토콜을 사용하지 않는 서비스 엔드 포인트 바인딩 때문일 수 있습니다. 이는 서버에서 HTTP 요청 컨텍스트를 중단했기 때문일 수도 있습니다 (서비스 종료로 인해). 자세한 내용은 서버 로그를 참조하십시오.]

URL의 서비스로 이동했으며 제대로 작동하고 있습니다. 함수에 대해 내가하는 일은 이미지 이름에 문자열을 반환하는 것이므로 전달되는 데이터가 많지 않습니다. 나는 로그를 추적했으며 동일한 정보를 제공합니다. 내 클라이언트 구성은 다음과 같습니다.

<binding name="basicHttpBinding_IWCFClient" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
         allowCookies="false">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                  maxNameTableCharCount="2147483647" />
    <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
</binding>
<endpoint name="basicHttpBinding_IWCFClient" 
    address="http://localhost:4295/Services/WCFClient.svc"
    binding="basicHttpBinding" 
    bindingConfiguration="basicHttpBinding_IWCFClient" 
    behaviorConfiguration="WCFGraphicManagementTool.Services.ClientBehavior"
    contract="WCFClient.IWCFClient" />

내 서버 구성은 다음과 같습니다.

<service behaviorConfiguration="WCFGraphicManagementTool.Services.WCFClientBehavior"
    name="WCFGraphicManagementTool.Services.WCFClient">
   <endpoint name="basicHttpBinding_IWCFClient"
       address="" 
       binding="basicHttpBinding" 
       contract="WCFGraphicManagementTool.Contracts.IWCFClient" />
   <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" />
</service>
<behavior name="WCFGraphicManagementTool.Services.WCFClientBehavior">
   <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   <serviceThrottling maxConcurrentCalls="120" maxConcurrentSessions="120"
                      maxConcurrentInstances="120" />
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

내 로컬 컴퓨터에서 작동하므로 서버의 설정일까요?


여기서 설명한대로 문제를 해결했습니다. stackoverflow.com/questions/5537794/…
Adi

당신이 나보다 더 멀리있는 것 같습니다. 다음에 수행 할 작업에 대한 지침을 제공 할 수 있습니다. stackoverflow.com/questions/16628382/…
Niels Brinch 2013 년

당신이 아직 하나를 얻기를 기다리고있는 것 같지 않기 때문에 당신은 어떤 대답이라도 받아 들일 가능성이 있습니까? :)
Noctis

답변:


100

직렬화 문제가 있다고 생각합니다. 정확한 오류는 <configuration>섹션의 서비스 구성에 아래 코드를 추가하면됩니다 .

구성 업데이트 "App_tracelog.svclog"파일이 생성되면 서비스가 존재하는 곳에서 .svclog파일 을 열고 왼쪽 패널에서 오류 인 빨간색 선을 찾아 자세한 정보를 보려면 설명을 참조하십시오.

이것이 귀하의 오류를 찾는 데 도움이되기를 바랍니다.

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="App_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
    </sharedListeners>
  </system.diagnostics>

4
이것은 실제로 내 하루를 구했습니다. 실제로 직렬화 문제 였고 System.Runtime.Serialization추적 에서 소스 가 누락되었습니다 .
julealgon 2013 년

니스 ...이 :)을 인식하지 않았다
Noctis

서사시! 예외에서 사용할 수 없었던 오류를 App_tracelog.svclog 파일에 기록합니다
fubo

훌륭한! 감사합니다
구문 에러

1
<system.diagnostics>섹션을 파일 위의 파일 끝에 붙여 넣어야합니다 </configuration>. 상단에 붙여 넣으면 앱 실행시 콘텐츠 유형 오류가 발생할 수 있습니다.
Tawab Wakil

76

"이것은 HTTP 프로토콜을 사용하지 않는 서비스 끝점 바인딩 때문일 수 있습니다"라는 문제가 발생했으며 WCF 서비스가 종료됩니다 (개발 컴퓨터에서)

나는 알아 냈습니다. 제 경우에는 문제가 Enums 때문이었습니다.

나는 이것을 사용하여 해결했다.

    [DataContract]
    [Flags]
    public enum Fruits
    {
        [EnumMember]
        APPLE = 1,
        [EnumMember]
        BALL = 2,
        [EnumMember]
        ORANGE = 3 

    }

DataContract, Flags 및 EnumMember 특성을 사용하여 모든 열거 형 멤버를 사용하여 Enum을 장식해야했습니다.

msdn 참조를 살펴본 후이 문제를 해결했습니다 .


1
감사합니다. 이것은 나도해야 할 일이었다.
Matthew Cole

1
감사합니다, 당신은 그냥 날 시간의 힙 저장
닉슨

4
감사합니다 아주 많이 ... 내 시간을 많이 저장
amesh

이와 관련-DataMember 유형이 아닌 계약에 열거 유형이있는 경우이 오류가 발생합니다. 방금 DataMember 인 속성을 추가하고 비 DataContract 열거 형 유형을 지정했습니다.
paz

열거 형이 인덱스 0에서 시작해야하는 경우도 아닌가? 이것은 확실히 과거의 문제였습니다. 따라서 위의 예에서 APPLE = 1이 아닌 0입니다.
The Senator


14

제 경우에는 복합 유형 중 하나에 set 메서드가없는 속성이 있기 때문에 오류가 발생했습니다.

그 사실 때문에 serializer에서 예외가 발생했습니다. 내부 설정 방법을 추가했으며 모두 잘 작동했습니다.

왜 이런 일이 발생하는지 알아내는 가장 좋은 방법은 (내 의견으로는) 추적 로깅을 활성화하는 것입니다.

다음 섹션을 내에 추가하여이를 달성했습니다 web.config.

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
  </sources>
  <trace autoflush="true" />
</system.diagnostics>

일단 설정되면 클라이언트를 실행하고 예외가 발생하고 'Traces.svclog'파일을 확인했습니다. 거기에서 나는 예외를 찾기 만하면되었다.


의 autoflush = 사실 키이었다
제레미 스미스

9

DataContract의 솔루션 인 Flags for Enums는 약간보기 흉해 보입니다. 제 경우에는 "NotSet = 0"과 같은 것을 열거 형에 추가하여 문제가 해결되었습니다.

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}

아 예, 죄송합니다. 추가 답변에 대해 언급했습니다. 나도이 행동을 보았다.
The Senator

설명 : 저도 같은 문제가있었습니다. Rikin의 대답은 나를 이끌어 @ : [로부터는 "의 InnerException 메시지가 '열거 값'0 '... 유형에 대한 유효했다" social.msdn.microsoft.com/Forums/vstudio/en-US/... 나는 JEM를 가지고 : "여기서 문제는 ..Response를 초기화하지 않고 '0'의 기본 (및 유효하지 않은) 값을 사용하고 있으므로 직렬화 할 수 없다는 것입니다."
AJ AJ

3

나는 같은 문제에 직면했고 아래 코드로 해결되었습니다. (TLS 연결 문제가있는 경우)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

클라이언트 채널을 열기 전에이 줄을 붙여 넣으십시오.


2

개체 그래프의 순환 참조로 인해이 오류가 발생하는 것을 보았습니다. 자식에서 부모 개체에 대한 포인터를 포함하면 serializer가 루프되고 궁극적으로 최대 메시지 크기를 초과합니다.


1

나는 문제를 알아 냈다. 내 구성 파일의 경로가 잘못되었습니다. WCF의 오류는 때때로 매우 유용합니다.


1

이 문제를 해결하기 위해 AppPool ID를 관리자 계정 으로 변경 해야했습니다 .


이것은 나에게 유용했습니다. Sarjan이 제안한대로 정확히 수행하지는 않았지만 응용 프로그램 폴더 (wwwroot ... 아래)에 대한 읽기 / 쓰기 권한을 사용중인 응용 프로그램 풀 ID에 부여했습니다.
Francesco B.

1

이 오류는 계약 불일치 때문일 수 있습니다. 아래의 세 계층 응용 프로그램을 고려하십시오.

UI 레이어
|
프로세스 레이어
|
Data Access
Layer-> Contract Between Process and UI layer has the same enum with missing (Onhold = 3). Enum : Start = 1, Stop = 2.-> Contract Between Data Access and Process layer has enum Enum : Start = 1, Stop = 2, Onhold = 3.

이 경우 프로세스 레이어 응답에서 동일한 오류가 발생합니다.

다층 애플리케이션의 다른 계약 불일치에서도 동일한 오류가 발생합니다.


귀하의 답변은 질문과 관련이없는 것 같습니다. OP가 이미 그의 문제를 해결했다는 점에 유의하십시오 . 구성 파일의 경로가 잘못되었습니다 .
Simon MᶜKenzie 2013 년

1

System.Data.DataTable을 반환하도록 WCF 서비스를 구성했기 때문에이 문제가 발생했습니다.

내 테스트 HTML 페이지에서는 잘 작동했지만 Windows Form 응용 프로그램에 넣을 때 폭발했습니다.

들어가서 서비스의 운영 계약 서명을 DataTable에서 DataSet으로 변경하고 그에 따라 데이터를 반환해야했습니다.

이 문제가있는 경우 기존 서비스에 의존하는 코드를 깨는 것에 대해 걱정할 필요가 없도록 서비스에 추가 운영 계약을 추가 할 수 있습니다.


1

이것은 여러 가지 이유 때문일 수 있습니다. 다음은 그 중 몇 가지입니다.

  1. 복잡한 데이터 계약 개체 (즉, 더 많은 하위 사용자 지정 개체가있는 사용자 지정 개체를 의미)를 사용하는 경우 DataContract 및 DataMember 특성으로 장식 된 모든 사용자 지정 개체가 있는지 확인합니다.
  2. 데이터 계약 개체가 상속을 사용하는 경우 모든 기본 클래스에 DataContract 및 DataMember 특성이 있는지 확인합니다. 또한 기본 클래스가 [KnownType (typeof (BaseClassType))] 속성을 사용하여 파생 클래스를 지정하도록해야합니다 ( 여기에 대한 자세한 정보 확인 ).

  3. 모든 데이터 계약 개체 속성에 get 및 set 속성이 모두 있는지 확인합니다.


1

내 문제는 클라이언트와 서버 사이에 너무 많은 항목이 전달된다는 것입니다. 나는 양쪽의 행동에서이 설정을 변경해야했다.

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

나는 같은 해결책을 사용했습니다. 하지만 오류인지 확인하기 위해 @ 100r이 제안한대로 Service Trace Viewer를 사용해야했습니다.
Björn

1

이것은 특정 문제와 관련이 없을 수 있지만 언급 한 오류 메시지에는 많은 원인이 있습니다. 그 중 하나는 추상, 인터페이스이거나 WCF 클라이언트 코드에 알려지지 않은 [OperationContract]에 대한 반환 형식을 사용하고 있습니다.

아래 게시물 (및 솔루션)을 확인하십시오.

https://stackoverflow.com/a/5310951/74138


1

이 문제를 해결하는 가장 좋은 방법은 오류 조언을 따라 서버 로그를 찾는 것입니다. 내가 추가 한 로그를 활성화하려면

 <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\TracesServ_ce.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

그런 다음 c : \ logs \ TracesServ_ce.svclog로 이동하여 Microsoft 서비스 추적 뷰어로 엽니 다. 그리고 문제가 실제로 무엇인지 확인하십시오.



1

나는 며칠 동안 이것으로 어려움을 겪고이 게시물과 다른 많은 사람들의 모든 답변을 시도하고 증상은 같지만 문제가 다르기 때문에 솔루션을 공유했습니다.

문제는 앱 풀이 메모리 제한으로 구성되어 있고 가변 기간 후에 재활용된다는 것입니다.

이것이 다른 사람에게 도움이되기를 바랍니다!
인사말,


1

내 문제는 내 서비스의 반환 유형이 문자열이라는 것입니다. 하지만 xml 유형의 문자열을 반환했습니다.

<reponse><state>1</state><message>Operation was successfull</message</response>

그래서 오류가 발생했습니다.


1

나의 경우에는

내 서비스는 download Files

이 오류는 다운로드를 시도 할 때만 나타납니다. Big Files

그래서 나는 필요한 가치 증가 에 대한이 대답 을 찾았 maxRequestLength습니다.web.config

이상하다는 건 알지만 문제가 해결되었습니다.

업로드 또는 다운로드 작업을 수행하지 않으면이 답변이 도움이되지 않을 수 있습니다.


1

나 에게이 오류의 해결책은 매우 이상합니다. EndpointAddress 의 포트 주소 문제였습니다 . Visual Studio에서 파일 (예 : Service1.svc)의 포트 주소와 wcf 프로젝트의 포트 주소는 EndpointAddress에 제공 한 것과 동일해야합니다 . 이 솔루션에 대해 자세히 설명하겠습니다.

포트 주소를 확인하는 두 단계가 있습니다.

  1. WCF 프로젝트에서 서비스 파일 (예 : Service1.svc)을 마우스 오른쪽 버튼으로 클릭-> 브라우저에서 지금 브라우저 에서 보기를 선택 하면 http : // localhost : 61122 / Service1.svc 와 같은 URL이 있으므로 이제 포트 주소를 다음 과 같이 기록해 둡니다 . 61122

  2. wcf 프로젝트를 마우스 오른쪽 버튼으로 클릭-> 속성 선택 -> 웹 탭으로 이동 -> 이제 서버 섹션으로 이동 -> Visual Studio 개발 서버 사용 -> 특정 포트를 선택 하고 이전에 Service1에서 찾은 포트 주소를 제공합니다. svc 서비스. 즉 (61122) 입니다.

이전에는 다른 포트 주소가 있습니다. EndpointAddress에 부여한 포트 주소를 올바르게 지정 하면 문제가 해결되었습니다.

이 문제가 해결되기를 바랍니다.


0

또한이 문제가 있었고 DataContract 및 DataMember 속성으로 모델을 장식하는 것을 잊었 기 때문이었습니다.


0

데이터베이스 (Visual Studio에서 작업 중)가있는 경우 테이블에 외래 키가 없는지 확인하고, 외래 키가 있었는데이 오류가 발생했으며 제거했을 때 원활하게 실행되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.