使用mod_mono的WCF服务

时间:2012-01-26 15:46:03

标签: c# .net wcf mono mod-mono

我正在尝试使用mono 2.10.8在CentOS上托管WCF服务,并将其作为REST或SOAP服务器进行访问。

我在包含web.config的文件夹中使用mod-mono-server-4启动了一个应用程序:

<configuration>
    <system.serviceModel>
        <services>
            <service behaviorConfiguration="WebBehavior" name="Services.Hello">
                <clear/>
                <endpoint address="http://DOMAIN/service" behaviorConfiguration="HelloBehavior" binding="webHttpBinding" contract="Services.IHello" />
                <endpoint address="http://DOMAIN/web" binding="basicHttpBinding" bindingConfiguration="" contract="Services.IHello" />
            </service>
        </services>
        <behaviors>
            <endpointBehaviors>
                <behavior name="HelloBehavior">
                    <webHttp/>
                </behavior>
            </endpointBehaviors>
            <serviceBehaviors>
                <behavior name="WebBehavior">
                    <serviceMetadata httpGetEnabled="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

如果我现在调用DOMAIN/web?wsdlDOMAIN/service/hello/hello是IHello中方法的WebGetAttribute的UriTemplate)我只得到404:

  

&#39; /&#39;中的服务器错误应用
  无法找到资源。

我还有一个Service.svc文件包含:

  

如果我致电DOMAIN/Service.svc/hello,我会收到SOAP错误:

  

请求消息包含目标&#39; http://DOMAIN/Service.svc/hello'采取行动&#39;&#39;在此服务合同中无法访问

如果我在服务器上启动控制台应用程序,执行以下操作:

WebServiceHost sh = new WebServiceHost(typeof(Hello), new Uri("http://localhost:681/service"));
sh.Open();

我可以在端口680上访问该服务,因此mono应该能够运行该服务,但我需要它与mod_mono一起运行(在端口80上)。

我需要以不同方式配置什么?

最后,我试图主持一个SyndicationFeed来提供RSS / Atom-Feeds。

1 个答案:

答案 0 :(得分:0)

我找到了解决方法让它运行ATM:
创建一个普通的* .asmx-WebService并创建一个类似的方法:

[WebMethod]
[SoapDocumentMethod(ParameterStyle=SoapParameterStyle.Bare)]
public XmlDocument Feed()
{
    SyndicationFeed feed = new SyndicationFeed();
    //Fill the feed...
    Atom10FeedFormatter atom = new Atom10FeedFormatter(feed);

    StringBuilder result = new StringBuilder();
    XmlWriter writer = XmlWriter.Create(result);
    atom.WriteTo(writer);
    writer.Flush();

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(result.ToString());

    return doc;
}

然后,您可以DOMAIN/Service.asmx/Feed访问Feed。