Mono中的自托管WCF服务

时间:2013-03-11 19:12:56

标签: c# wcf mono self-hosting

我目前正在开发一个C#项目,这是一个控制台应用程序,其中包含一个WCF soap服务。

以下是我用来打开主机的代码。

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位。

我不知道从哪里开始研究这个问题。

感谢您提供的任何帮助

更新 根据Rob Goodwins的建议,我已经添加了MONO_STRICT_MS_COMPLIANT作为环境变量,似乎确实有效,我可以访问该服务。但是,我现在遇到了另一个问题。我有一个PHP页面,它每隔几秒就会发出几个请求,但过了一分钟后,我的应用程序崩溃了。

我得到以下异常:

  

此XmlWriter在此状态下不接受StartTag错误。在   System.Xml.XmlTextWriter.WriteStartElement(System.String前缀,   System.String localName,System.String namespaceUri)[0x00000] in   :0点   System.Xml.DefaultXmlWriter.WriteStartElement(System.String前缀,   System.String localName,System.String ns)[0x00000] in:0 at System.Xml.XmlWriter.WriteStartElement(System.String   localName,System.String ns)[0x00000] in:0 at   System.ServiceModel.Logger.TraceCore(TraceEventType eventType,Int32   id,Boolean hasRelatedActivity,Guid relatedActivity,System.Object []   数据)[0x00000] in:0 at   System.ServiceModel.Logger.LogMessage   (System.ServiceModel.Diagnostics.MessageLogTraceRecord log)[0x00000]   in:在System.ServiceModel.Logger.LogMessage中为0   (MessageLogSourceKind sourceKind,   System.ServiceModel.Channels.Message&安培; msg,Int64 maxMessageSize)   [0x00000] in:0 at   System.ServiceModel.Channels.Http.HttpRequestContext.InternalReply   (System.ServiceModel.Channels.Message消息,TimeSpan超时)[0x00000]   in:0 at   System.ServiceModel.Channels.Http.HttpRequestContext.Reply   (System.ServiceModel.Channels.Message消息,TimeSpan超时)[0x00000]   in:0 at   System.ServiceModel.Dispatcher.MessageProcessingContext.Reply(布尔值   useTimeout)[0x00000] in:0 at   System.ServiceModel.Dispatcher.OperationInvokerHandler.Reply   (System.ServiceModel.Dispatcher.MessageProcessingContext mrc,Boolean   useTimeout)[0x00000] in:0 at   System.ServiceModel.Dispatcher.OperationInvokerHandler.ProcessRequest   (System.ServiceModel.Dispatcher.MessageProcessingContext mrc)   [0x00000] in:0 at   System.ServiceModel.Dispatcher.BaseRequestProcessorHandler.ProcessRequestChain   (System.ServiceModel.Dispatcher.MessageProcessingContext mrc)   [0x00000] in:0 at   System.ServiceModel.Dispatcher.BaseRequestProcessorHandler.ProcessRequestChain   (System.ServiceModel.Dispatcher.MessageProcessingContext mrc)   [0x00000] in:0 at   System.ServiceModel.Dispatcher.HandlersChain.ProcessRequestChain   (System.ServiceModel.Dispatcher.MessageProcessingContext mrc)   [0x00000] in:0 at   System.ServiceModel.Dispatcher.BaseRequestProcessor.ProcessRequest   (System.ServiceModel.Dispatcher.MessageProcessingContext mrc)   [0x00000] in:0

     

未处理的异常:System.InvalidOperationException:此XmlWriter   在此状态下不接受StartTag错误。在   System.Xml.XmlTextWriter.WriteStartElement(System.String前缀,   System.String localName,System.String namespaceUri)[0x00000] in   :0点   System.Xml.DefaultXmlWriter.WriteStartElement(System.String前缀,   System.String localName,System.String ns)[0x00000] in:0 at System.Xml.XmlWriter.WriteStartElement(System.String   localName,System.String ns)[0x00000] in:0 at   System.ServiceModel.Logger.TraceCore(TraceEventType eventType,Int32   id,Boolean hasRelatedActivity,Guid relatedActivity,System.Object []   数据)[0x00000] in:0 at   System.ServiceModel.Logger.Log(TraceEventType eventType,   System.String消息,System.Object [] args)[0x00000] in:0 at System.ServiceModel.Logger.Error(System.String   消息,System.Object [] args)[0x00000] in:0 at   System.ServiceModel.Dispatcher.ListenerLoopManager.ProcessErrorWithHandlers   (IChannel ch,System.Exception ex,   System.ServiceModel.Channels.Message&安培; res)[0x00000] in:0 at   System.ServiceModel.Dispatcher.ListenerLoopManager.ProcessRequest   (IReplyChannel回复,System.ServiceModel.Channels.RequestContext rc)   [0x00000] in:0 at   System.ServiceModel.Dispatcher.ListenerLoopManager.TryReceiveRequestDone   (IAsyncResult结果)[0x00000] in:0

我似乎也无法通过VS2010 WCF测试客户端访问该服务,它不会出现错误,它只是位于50%的进度条并且没有得到任何服务进一步

在apache错误日志中,我收到以下错误:

  

System.ArgumentException:应该是这样的   [[hostname:] port:] VPath:realpath at   Mono.WebServer.ApplicationServer.AddApplicationsFromCommandLine   (System.String应用程序)[0x00000] in:0 at   (包装器remoting-invoke-with-check)   Mono.WebServer.ApplicationServer:AddApplicationsFromCommandLine   (字符串)在Mono.WebServer.Apache.Server.RealMain(System.String []   args,布尔根,IApplicationHost ext_apphost,布尔安静)   [0x00000] in:0 at(包装器   remoting-invoke-with-check)Mono.WebServer.Apache.Server:RealMain   (string [],bool,Mono.WebServer.IApplicationHost,bool)at   Mono.WebServer.Apache.Server.Main(System.String [] args)[0x00000] in   :0 [错误]致命未处理例外:   System.ArgumentException:应该是这样的   [[hostname:] port:] VPath:realpath at   Mono.WebServer.ApplicationServer.AddApplicationsFromCommandLine   (System.String应用程序)[0x00000] in:0 at   (包装器remoting-invoke-with-check)   Mono.WebServer.ApplicationServer:AddApplicationsFromCommandLine   (字符串)在Mono.WebServer.Apache.Server.RealMain(System.String []   args,布尔根,IApplicationHost ext_apphost,布尔安静)   [0x00000] in:0 at(包装器   remoting-invoke-with-check)Mono.WebServer.Apache.Server:RealMain   (string [],bool,Mono.WebServer.IApplicationHost,bool)at   Mono.WebServer.Apache.Server.Main(System.String [] args)[0x00000] in   :0

更新2: 我似乎现在有点工作,除了我只能在本地访问服务。即Web服务可以在本地访问,功能可以按照自己的意愿运行,但是我无法从另一台PC访问它。即我试图从开发PC的开发PC使用WCF测试客户端访问Mono服务器上的WCF服务,然后我得到以下输出:

  

错误:无法从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/'。
  内容类型application / soap + xml; charset = utf-8不受支持   服务http://192.168.1.74:6525/。客户端和服务绑定   可能不匹配。远程服务器返回错误:(415)   预期的内容类型' text / xml;字符集= UTF-8'但得到了   '应用/肥皂+ xml的; charset = utf-8' .HTTP GET错误URI:   http://192.168.1.74:6525/该文件已被理解,但可以   不被处理。 - WSDL文档包含无法链接的链接   得到解决。 - 下载时出错   ' http://localhost:6525/?xsd=xsd0&#39 ;. - 无法连接到遥控器   server - 由于目标计算机无法建立连接   积极拒绝它127.0.0.1:6525。

更新3: 经过进一步的测试,它看起来好像是一次性拨打多个电话。使用该服务不断地在浏览器页面上进行刷新似乎会使其崩溃。

看起来好像Mono中的System.ServiceModel.Logger.TraceCore有问题。有没有办法禁用这部分单声道,所以我不会受到这个问题的影响。

1 个答案:

答案 0 :(得分:1)

似乎托管服务器可能存在一些与权限相关的问题,请检查一次特定端口的权限。希望这可能有用。