Как вызвать операцию сервиса в конечной точке WCF в стиле REST? - PullRequest
0 голосов
/ 25 мая 2010

возможно ли вызвать сервисную операцию в конечной точке wcf с помощью собственной службы?

Я хочу вызвать некоторую операцию службы по умолчанию, когда клиент вводит конечную точку URI службы.

В следующем примере эти uris правильно вызывают объявленные операции (SayHello, SayHi):

- http://localhost:4711/clerk/hello
- http://localhost:4711/clerk/hi

Но ури

- http://localhost:4711/clerk

не вызывает объявленную операцию SayWelcome. Вместо этого он ведет на хорошо известную страницу «Отключение публикации метаданных». Включение mex не помогает, в этом случае mex-страница отображается в конечной точке uri.

private void StartSampleServiceHost()
{
    ServiceHost serviceHost = new ServiceHost(typeof(Clerk), new Uri( "http://localhost:4711/clerk/"));
    ServiceEndpoint endpoint = serviceHost.AddServiceEndpoint(typeof(IClerk), new WebHttpBinding(), "");
    endpoint.Behaviors.Add(new WebHttpBehavior());
    serviceHost.Open();
}

[ServiceContract]
public interface IClerk
{
    [OperationContract, WebGet(UriTemplate = "")]
    Stream SayWelcome();

    [OperationContract, WebGet(UriTemplate = "/hello/")]
    Stream SayHello();

    [OperationContract, WebGet(UriTemplate = "/hi/")]
    Stream SayHi();
}    

public class Clerk : IClerk
{
    public Stream SayWelcome() { return Say("welcome"); }

    public Stream SayHello() { return Say("hello"); }

    public Stream SayHi() { return Say("hi"); }

    private Stream Say(string what)
    {
        string page = @"<html><body>" + what + "</body></html>";
        return new MemoryStream(Encoding.UTF8.GetBytes(page));
    }
}

Есть ли способ отключить обработку mex и вместо этого включить объявленную операцию?

Заранее спасибо, Дитер

1 Ответ

1 голос
/ 25 мая 2010

Вы пробовали?

[OperationContract, WebGet(UriTemplate = "/")]
Stream SayWelcome();

UPDATE:

Не знаю, почему он не работает для вас, у меня есть служба WCF, размещенная самостоятельно, со следующим контрактом на обслуживание:

[ServiceContract]
public interface IDiscoveryService {

    [OperationContract]
    [WebGet(BodyStyle=WebMessageBodyStyle.Bare, UriTemplate="")]
    Stream GetDatasets();

Единственное отличие, которое я вижу, это то, что я использую WebServiceHost вместо ServiceHost.

...