【问题标题】:How to call a service operation at a REST style WCF endpoint uri?如何在 REST 样式的 WCF 端点 uri 上调用服务操作?
【发布时间】:2010-05-25 10:03:29
【问题描述】:

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

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

在以下示例中,这些 uri 正确调用了声明的操作(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 处理并启用声明的操作?

提前致谢,迪特

【问题讨论】:

    标签: wcf rest endpoint


    【解决方案1】:

    你试过了吗?

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

    更新:

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

    [ServiceContract]
    public interface IDiscoveryService {
    
        [OperationContract]
        [WebGet(BodyStyle=WebMessageBodyStyle.Bare, UriTemplate="")]
        Stream GetDatasets();
    

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

    【讨论】:

    • 是的,我试过了。结果相同。这与 MS 文档一致,该文档指出忽略 uri 模板字符串开头和结尾的斜线。不幸的是,它没有帮助。谢谢你的建议,达雷尔。
    • 达雷尔,非常感谢。 WebServiceHost 有所作为。当我使用 WebServiceHost 而不是 ServiceHost 时,一切正常!最好的问候,迪特
    猜你喜欢
    • 2010-09-16
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2014-02-04
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多