[C#] 서버에서 IncludeExceptionDetailInFaults (ServiceBehaviorAttribute 또는 <serviceDebug> 구성 동작)를 설정하십시오.
나는 완벽하게 작동하는 WCF 서비스를 가지고 있으며 무언가가 바뀌었고 무엇을 알지 못합니다.
이 예외가 발생합니다.
System.ServiceModel.FaultException : 서버가 내부 오류로 인해 요청을 처리 할 수 없습니다. 오류에 대한 자세한 내용을 보려면 서버에서 IncludeExceptionDetailInFaults (ServiceBehaviorAttribute 또는 구성 동작)를 설정하여 예외 정보를 다시 클라이언트로 보내거나 Microsoft .NET Framework 3.0 SDK 설명서에 따라 추적을 설정하십시오. 서버 추적 로그를 검사하십시오.
.NET 4.0을 실행하고 있기 때문에 혼란 스럽습니다.
어디서 켤 IncludeExceptionDetailInFaults
까요? 나는 그것을 찾기 위해 싸우고있다.
답변
파일 에서 동작 을 정의하십시오 .config
.
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="debug">
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
...
</system.serviceModel>
</configuration>
그런 다음 다음 행을 따라 서비스에 동작을 적용하십시오.
<configuration>
<system.serviceModel>
...
<services>
<service name="MyServiceName" behaviorConfiguration="debug" />
</services>
</system.serviceModel>
</configuration>
프로그래밍 방식으로 설정할 수도 있습니다. 이 질문을 참조하십시오 .
답변
app.config 파일에 있습니다.
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceDebug includeExceptionDetailInFaults="true"/>
답변
코드로이 작업을 수행하려면 다음과 같은 동작을 추가하십시오.
serviceHost.Description.Behaviors.Remove(
typeof(ServiceDebugBehavior));
serviceHost.Description.Behaviors.Add(
new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
답변
인터페이스를 상속하는 클래스 선언 위의 [ServiceBehavior] 태그에서 설정할 수도 있습니다.
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyClass:IMyService
{
...
}
Immortal Blue는 실행 세부 사항을 공개적으로 출시 된 버전에 공개하지 않는 것이 맞지만 테스트 목적으로 편리한 도구입니다. 손을 떼면 항상 전원을 끄십시오.
답변
또한 동일한 오류가 발생했습니다. 개발 환경에서 자격 증명으로 WCF를 사용할 때 WCF가 제대로 작동했지만 다른 사람이 테스트에서 사용하면 동일한 오류가 발생했습니다. 나는 많은 연구를 한 다음 구성 업데이트를 수행하는 대신 결함 예외를 사용하여 WCF 방법에서 예외를 처리했습니다. 또한 WCF의 ID는 데이터베이스에서 액세스 할 수있는 동일한 자격 증명으로 설정해야합니다. 누군가 권한을 변경했을 수 있습니다. 동일한 코드 아래에서 찾으십시오.
[ServiceContract]
public interface IService1
{
[OperationContract]
[FaultContract(typeof(ServiceData))]
ForDataset GetCCDBdata();
[OperationContract]
[FaultContract(typeof(ServiceData))]
string GetCCDBdataasXMLstring();
//[OperationContract]
//string GetData(int value);
//[OperationContract]
//CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}
[DataContract]
public class ServiceData
{
[DataMember]
public bool Result { get; set; }
[DataMember]
public string ErrorMessage { get; set; }
[DataMember]
public string ErrorDetails { get; set; }
}
service1.svc.cs에서 catch 블록에서 이것을 사용할 수 있습니다.
catch (Exception ex)
{
myServiceData.Result = false;
myServiceData.ErrorMessage = "unforeseen error occured. Please try later.";
myServiceData.ErrorDetails = ex.ToString();
throw new FaultException<ServiceData>(myServiceData, ex.ToString());
}
아래 코드와 같이 클라이언트 응용 프로그램에서 이것을 사용하십시오.
ConsoleApplicationWCFClient.CCDB_HIG_service.ForDataset ds = obj.GetCCDBdata();
string str = obj.GetCCDBdataasXMLstring();
}
catch (FaultException<ConsoleApplicationWCFClient.CCDB_HIG_service.ServiceData> Fex)
{
Console.WriteLine("ErrorMessage::" + Fex.Detail.ErrorMessage + Environment.NewLine);
Console.WriteLine("ErrorDetails::" + Environment.NewLine + Fex.Detail.ErrorDetails);
Console.ReadLine();
}
이것을 시도하면 정확한 문제를 얻는 데 도움이됩니다.
답변
오류 정보가 먼저 말했듯이 클라이언트 측과 서비스 측 모두에서 다음과 같이 시간 초과 값을 늘리십시오.
<basicHttpBinding>
<binding name="basicHttpBinding_ACRMS" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647"
openTimeout="00:20:00"
receiveTimeout="00:20:00" closeTimeout="00:20:00"
sendTimeout="00:20:00">
<readerQuotas maxDepth="32" maxStringContentLength="2097152"
maxArrayLength="2097152" maxBytesPerRead="4006" maxNameTableCharCount="16384" />
</binding>
그런 다음 다음을 수행하여이 바인딩 구성을 엔드 포인트에 적용하는 것을 잊지 마십시오.
<endpoint address="" binding="basicHttpBinding"
bindingConfiguration="basicHttpBinding_ACRMS"
contract="MonitorRAM.IService1" />
위의 방법으로 도움이되지 않으면 여기에 기본 프로젝트를 업로드하려고하면 더 좋을 것입니다. 내 테스트를하고 싶습니다.