Включите IncludeExceptionDetailInFaults (либо из ServiceBehaviorAttribute, либо из поведения конфигурации <serviceDebug>) на сервере
У меня есть служба WCF, которая работает отлично, и что-то изменилось, и я не знаю что.
Я получаю это исключение:
System.ServiceModel.FaultException: сервер не смог обработать запрос из-за внутренней ошибки. Для получения дополнительной информации об ошибке включите IncludeExceptionDetailInFaults (либо из ServiceBehaviorAttribute, либо из поведения конфигурации) на сервере, чтобы отправить информацию об исключении обратно клиенту или включить трассировку в соответствии с документацией Microsoft.NET Framework 3.0 SDK и проверьте журналы трассировки сервера.
Это запутанно, потому что я запускаю .NET 4.0.
Где включить IncludeExceptionDetailInFaults
? Я сражаюсь, чтобы найти его.
Ответы
Ответ 1
Определите поведение в вашем файле .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>
Вы также можете установить его программно. См. этот вопрос.
Ответ 2
Он находится в файле app.config.
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceDebug includeExceptionDetailInFaults="true"/>
Ответ 3
Если вы хотите сделать это по коду, вы можете добавить такое поведение следующим образом:
serviceHost.Description.Behaviors.Remove(
typeof(ServiceDebugBehavior));
serviceHost.Description.Behaviors.Add(
new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
Ответ 4
Вы также можете установить его в теге [ServiceBehavior] над объявлением класса, который наследует интерфейс
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyClass:IMyService
{
...
}
Immortal Blue правильна, не раскрывая детали exeption публично выпущенной версии, но для целей тестирования это удобный инструмент. Всегда отключайтесь при отпускании.
Ответ 5
Я также получал ту же ошибку, WCF работал правильно для меня, когда я использовал его в среде Dev с моими учетными данными, но когда кто-то использовал его в TEST, он выдавал ту же ошибку.
Я провел много исследований, а затем вместо обновлений конфигурации обработал исключение в методе WCF с помощью исключения ошибки.
Кроме того, идентификатор для WCF должен быть установлен с теми же учетными данными, которые имеют доступ в базе данных, кто-то, возможно, изменил ваши полномочия.
Ниже приведен код для этого:
[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();
}
Просто попробуйте это, это поможет точно получить точную проблему.
Ответ 6
Как следует из первой информации об ошибке, попробуйте увеличить значение тайм-аута как на стороне клиента, так и на стороне обслуживания следующим образом:
<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" />
Если вышеуказанное не поможет, будет лучше, если вы можете попробовать загрузить свой основной проект здесь, а затем я хочу пройти тест на моей стороне.