내 로컬 컴퓨터에서 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>
내 로컬 컴퓨터에서 작동하므로 서버의 설정일까요?
답변
직렬화 문제가 있다고 생각합니다. 정확한 오류는 <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>
답변
“이것은 HTTP 프로토콜을 사용하지 않는 서비스 끝점 바인딩 때문일 수 있습니다”라는 문제가 발생했으며 WCF 서비스가 종료됩니다 (개발 컴퓨터에서)
나는 알아 냈습니다. 제 경우에는 문제가 Enums 때문이었습니다.
나는 이것을 사용하여 해결했다.
[DataContract]
[Flags]
public enum Fruits
{
[EnumMember]
APPLE = 1,
[EnumMember]
BALL = 2,
[EnumMember]
ORANGE = 3
}
DataContract, Flags 및 EnumMember 특성을 사용하여 모든 열거 형 멤버를 사용하여 Enum을 장식해야했습니다.
이 msdn 참조를 살펴본 후이 문제를 해결했습니다 .
답변
나는 이와 같은 오류가 있었고 문제는 직렬화였습니다. Service Trace Viewer http://msdn.microsoft.com/en-us/library/ms732023.aspx를 사용하여 실제 문제를 찾아서 쉽게 해결했습니다. 아마도 이것은 누군가를 도울 것입니다.
답변
제 경우에는 복합 유형 중 하나에 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’파일을 확인했습니다. 거기에서 나는 예외를 찾기 만하면되었다.
답변
DataContract의 솔루션 인 Flags for Enums는 약간보기 흉해 보입니다. 제 경우에는 “NotSet = 0″과 같은 것을 열거 형에 추가하여 문제가 해결되었습니다.
public enum Fruits
{
UNKNOWN = 0,
APPLE = 1,
BALL = 2,
ORANGE = 3
}
답변
나는 같은 문제에 직면했고 아래 코드로 해결되었습니다. (TLS 연결 문제가있는 경우)
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
클라이언트 채널을 열기 전에이 줄을 붙여 넣으십시오.
답변
개체 그래프의 순환 참조로 인해이 오류가 발생하는 것을 보았습니다. 자식에서 부모 개체에 대한 포인터를 포함하면 serializer가 루프되고 궁극적으로 최대 메시지 크기를 초과합니다.