В настоящее время я работаю над проектом С#, который представляет собой консольное приложение, в котором размещено WC-мыло.
Ниже приведен код, который я использую, чтобы открыть хост.
var baseAddress = new Uri(Configuration.soapServerSettings.soapServerUrl);
var host = new ServiceHost(typeof(SoapServer), baseAddress);
BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
var meta = new ServiceMetadataBehavior()
{
HttpGetEnabled = true,
HttpGetUrl = new Uri("", UriKind.Relative)
};
host.Description.Behaviors.Add(meta);
var debugBehaviour = new ServiceDebugBehavior()
{
HttpHelpPageEnabled = true,
HttpHelpPageUrl = new Uri("", UriKind.Relative),
IncludeExceptionDetailInFaults = true
};
ServiceEndpoint endpnt = host.AddServiceEndpoint(
typeof(ISoapInterface),
basicHttpBinding,
"EmailServer");
host.Description.Behaviors.Remove(typeof(ServiceDebugBehavior));
host.Description.Behaviors.Add(debugBehaviour);
host.Open();
Это отлично работает в Windows, но в Linux, когда я получаю доступ к нему, я получаю следующее сообщение:
Ошибка XmlSchema: Именованный элемент http://schemas.microsoft.com/2003/10/Serialization/:anyType был уже содержащихся в таблице объектов схемы. Рассмотрите настройку MONO_STRICT_MS_COMPLIANT на "да", чтобы имитировать реализацию MS. Связанный Элемент схемы SourceUri:, Строка 3, Позиция 3.
Я не знаю, с чего начать изучать эту проблему.
Спасибо за любую помощь, которую вы можете предоставить
Update:
Согласно предложению Роб Гудвинса, я добавил MONO_STRICT_MS_COMPLIANT
в качестве переменной среды, которая, похоже, сработала, я могу получить доступ к этой службе. Однако сейчас у меня другая проблема. У меня есть страница PHP, которая выполняет несколько запросов каждые пару секунд, но через минуту мое приложение падает.
Я получаю следующее исключение:
Этот XmlWriter не принимает StartTag в этом состоянии Ошибка. в System.Xml.XmlTextWriter.WriteStartElement(префикс System.String, System.String localName, System.String namespaceUri) [0x00000] в: 0 на System.Xml.DefaultXmlWriter.WriteStartElement(префикс System.String, System.String localName, System.String ns) [0x00000] в: 0 в System.Xml.XmlWriter.WriteStartElement(System.String localName, System.String ns) [0x00000] в: 0 at System.ServiceModel.Logger.TraceCore(TraceEventType eventType, Int32 id, Boolean hasRelatedActivity, Guid relatedActivity, System.Object [] данные) [0x00000] в: 0 на System.ServiceModel.Logger.LogMessage(System.ServiceModel.Diagnostics.MessageLogTraceRecord log) [0x00000] в: 0 в System.ServiceModel.Logger.LogMessage(MessageLogSourceKind sourceKind, System.ServiceModel.Channels.Message & msg, Int64 maxMessageSize) [0x00000] в: 0 на System.ServiceModel.Channels.Http.HttpRequestContext.InternalReply(System.ServiceModel.Channels.Message msg, тайм-аут TimeSpan) [0x00000] в: 0 на System.ServiceModel.Channels.Http.HttpRequestContext.Reply(System.ServiceModel.Channels.Message msg, тайм-аут TimeSpan) [0x00000] в: 0 на System.ServiceModel.Dispatcher.MessageProcessingContext.Reply(Boolean useTimeout) [0x00000] в: 0 на System.ServiceModel.Dispatcher.OperationInvokerHandler.Reply(System.ServiceModel.Dispatcher.MessageProcessingContext mrc, Boolean useTimeout) [0x00000] в: 0 на System.ServiceModel.Dispatcher.OperationInvokerHandler.ProcessRequest(System.ServiceModel.Dispatcher.MessageProcessingContext mrc) [0x00000] в: 0 на System.ServiceModel.Dispatcher.BaseRequestProcessorHandler.ProcessRequestChain(System.ServiceModel.Dispatcher.MessageProcessingContext mrc) [0x00000] в: 0 на System.ServiceModel.Dispatcher.BaseRequestProcessorHandler.ProcessRequestChain(System.ServiceModel.Dispatcher.MessageProcessingContext mrc) [0x00000] в: 0 на System.ServiceModel.Dispatcher.HandlersChain.ProcessRequestChain(System.ServiceModel.Dispatcher.MessageProcessingContext mrc) [0x00000] в: 0 на System.ServiceModel.Dispatcher.BaseRequestProcessor.ProcessRequest(System.ServiceModel.Dispatcher.MessageProcessingContext mrc) [0x00000] в: 0
Необработанное исключение: System.InvalidOperationException: этот XmlWriter не принимает StartTag в этом состоянии Ошибка. в System.Xml.XmlTextWriter.WriteStartElement(префикс System.String, System.String localName, System.String namespaceUri) [0x00000] в: 0 на System.Xml.DefaultXmlWriter.WriteStartElement(префикс System.String, System.String localName, System.String ns) [0x00000] в: 0 в System.Xml.XmlWriter.WriteStartElement(System.String localName, System.String ns) [0x00000] в: 0 at System.ServiceModel.Logger.TraceCore(TraceEventType eventType, Int32 id, Boolean hasRelatedActivity, Guid relatedActivity, System.Object [] данные) [0x00000] в: 0 на System.ServiceModel.Logger.Log(TraceEventType eventType, Сообщение System.String, System.Object [] args) [0x00000] в: 0 в System.ServiceModel.Logger.Error(System.String message, System.Object [] args) [0x00000] в: 0 at System.ServiceModel.Dispatcher.ListenerLoopManager.ProcessErrorWithHandlers(IChannel ch, System.Exception ex, System.ServiceModel.Channels.Message & res) [0x00000] в: 0 на System.ServiceModel.Dispatcher.ListenerLoopManager.ProcessRequest(IRplyChannel reply, System.ServiceModel.Channels.RequestContext rc) [0x00000] в: 0 на System.ServiceModel.Dispatcher.ListenerLoopManager.TryReceiveRequestDone(Результат IAsyncResult) [0x00000] в: 0
Я также не могу получить доступ к службе через VS2010 WCF Test Client, это не ошибка, она просто сидит там с индикатором выполнения на уровне 50% и больше не получает.
В журнале ошибок apache появляется следующая ошибка:
System.ArgumentException: должно быть что-то вроде [[hostname:] port:] VPath: realpath at Mono.WebServer.ApplicationServer.AddApplicationsFromCommandLine(Приложения System.String) [0x00000] в: 0 на (обход-удалять-вызывать-с-проверкой) Mono.WebServer.ApplicationServer: AddApplicationsFromCommandLine (строка) в Mono.WebServer.Apache.Server.RealMain(System.String [] args, Boolean root, IApplicationHost ext_apphost, Boolean quiet) [0x00000] в: 0 at (обертка remoting-invoke-with-check) Mono.WebServer.Apache.Server: RealMain (строка [], bool, Mono.WebServer.IApplicationHost, bool) в Mono.WebServer.Apache.Server.Main(System.String [] args) [0x00000] в: 0 [ОШИБКА] FATAL UNHANDLED EXCEPTION: System.ArgumentException: должно быть что-то вроде [[hostname:] port:] VPath: realpath at Mono.WebServer.ApplicationServer.AddApplicationsFromCommandLine(Приложения System.String) [0x00000] в: 0 на (обход-удалять-вызывать-с-проверкой) Mono.WebServer.ApplicationServer: AddApplicationsFromCommandLine (строка) в Mono.WebServer.Apache.Server.RealMain(System.String [] args, Boolean root, IApplicationHost ext_apphost, Boolean quiet) [0x00000] в: 0 at (обертка remoting-invoke-with-check) Mono.WebServer.Apache.Server: RealMain (строка [], bool, Mono.WebServer.IApplicationHost, bool) в Mono.WebServer.Apache.Server.Main(System.String [] args) [0x00000] в: 0
Обновление 2: Кажется, сейчас у меня это работает, но я могу только получить доступ к сервису локально. То есть веб-службу можно получить локально, а функции выполняют то, что должны, но я не могу получить к ней доступ с другого ПК. То есть Я пытаюсь получить доступ к службе WCF на сервере Mono с помощью тестового клиента WCF с моего компьютера-разработчика с dev-компьютера, и затем я получаю следующий вывод:
Ошибка: невозможно получить метаданные из
http://192.168.1.74:6525/
Если это это служба Windows (R) Communication Foundation, к которой у вас есть доступа, убедитесь, что вы включили публикацию метаданных на указанный адрес. Чтобы помочь в публикации метаданных, пожалуйста, обратитесь к документации MSDN по адресу http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadataобмен URI ошибки:http://192.168.1.74:6525/
Метаданные содержат ссылку, которая не может быть решена:'http://192.168.1.74:6525/
'.
Content Type application/soap + xml; charset = utf-8 не поддерживался службыhttp://192.168.1.74:6525/
. Связывание клиентов и сервисов могут быть несовместимы. Удаленный сервер возвратил ошибку: (415) Ожидаемый тип содержимого text/xml; charset = utf-8 ', но получил "Приложения/мыло + XML; charset = utf-8'.HTTP GET Ошибка URI:http://192.168.1.74:6525/
Документ был понят, но он мог не обрабатываться. - Документ WSDL содержит ссылки, которые не могли быть разрешенным. - Произошла ошибка при загрузкеhttp://localhost:6525/?xsd=xsd0
'. - Не удается подключиться к удаленному server - соединение не может быть выполнено, поскольку целевая машина активно отказался от него 127.0.0.1:6525.
Обновление 3: При дальнейшем тестировании это выглядит так, как если бы многие звонки были сделаны в службу за один раз. Постоянно зависающее обновление на странице браузера, использующее сервис, похоже, разбивает его.
Похоже, что что-то не так с System.ServiceModel.Logger.TraceCore
внутри Mono. Есть ли способ отключить эту часть моно, чтобы я не затронул эту проблему.