Служба WCF с использованием mod_mono - PullRequest
0 голосов
/ 26 января 2012

Я пытаюсь разместить службу WCF в CentOS с использованием mono 2.10.8 и получить доступ к нему как к серверу REST или SOAP.

Я запустил приложение, используя mod-mono-server-4, в папке, содержащей мой файл web.config:

<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?wsdl или DOMAIN/service/hello (/hello - это UriTemplate WebGetAttribute метода в IHello), я получу только 404:

Ошибка сервера в «/» приложении
Ресурс не найден.

У меня также есть Service.svc файл, содержащий:

Если я позвоню DOMAIN/Service.svc/hello, я получу ошибку SOAP:

Сообщение с запросом имеет цель 'http://DOMAIN/Service.svc/hello' с действием' ', которая недоступна в этом контракте на обслуживание

Если я запускаю консольное приложение на сервере, выполняя следующее:

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 голосов
/ 26 января 2012

Я нашел обходной путь для запуска банкомата:
Создайте обычный * .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.

...