如何在REST样式的WCF端点uri上调用服务操作?

时间:2010-05-25 10:03:29

标签: wcf rest endpoint

是否可以使用自托管服务在wcf端点uri上调用服务操作?

当客户端进入服务的端点uri时,我想调用一些默认服务操作。

在下面的示例中,这些uris正确调用声明的操作(SayHello,SayHi):

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

但是uri

- 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处理并启用声明的操作?

提前致谢,Dieter

1 个答案:

答案 0 :(得分:1)

你试过吗?

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

更新:

不确定为什么它不适合您,我有一个自托管的WCF服务,其服务合同如下:

[ServiceContract]
public interface IDiscoveryService {

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

我能看到的唯一区别是我使用WebServiceHost而不是ServiceHost。