wcf rest message inspector url redirect

时间:2015-04-28 01:13:58

标签: c# wcf rest redirect

我在使用消息检查器为我的WCF REST服务实现URL重定向时遇到了问题。我们的想法是实现AfterReceiveRequest以更改传入请求以有效地执行任何操作,然后在BeforeSendReply中,调用另一个提供实际服务的URI。您可以将此场景视为我们不想破坏客户端的内容,因此他们继续使用旧URI进行调用,但在内部我们将它们重定向到不同的URI。

例如,这就是我的服务合同:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebGet(UriTemplate = "person/{person}")]
    string GreetMe(string person);

    [OperationContract]
    [WebGet(UriTemplate = "donothing")]
    string DoNothing();
}

这是实施:

public class Service1 : IService1
{
    public string GreetMe(string person)
    {
        return string.Format("Hi {0}", person);
    }

    public string DoNothing()
    {
        return string.Empty;
    }
}

然后我将MessageInspector添加到端点行为。这个检查员的AfterReceiveRequest是这样的:

        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            OperationContext operationContext = OperationContext.Current;

            if (WebOperationContext.Current != null && WebOperationContext.Current.IncomingRequest.UriTemplateMatch != null)
            {
                UriBuilder baseUriBuilder = new UriBuilder(WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri);
                UriBuilder requestUriBuilder = new UriBuilder(WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri);

                OperationContext.Current.IncomingMessageProperties["MicrosoftDataServicesRootUri"] = baseUriBuilder.Uri.ToString();
                OperationContext.Current.IncomingMessageProperties["MicrosoftDataServicesRequestUri"] = baseUriBuilder.Uri.ToString() + "donothing";
                OperationContext.Current.IncomingMessageHeaders.To = new Uri(baseUriBuilder.Uri.ToString() + "donothing");
                operationContext.IncomingMessageProperties["Via"] = new Uri(baseUriBuilder.Uri.ToString() + "donothing");
                request.Headers.To = new Uri(baseUriBuilder.Uri.ToString() + "donothing");
            }

            return null;
        }

基本上,我想更改所有传入的请求以转到DoNothing()操作。但是,当我运行它时,我仍然看到请求使其成为GreetMe方法。我附加了调试器,可以看到AfterReceiveRequest中的代码正在执行,但我不确定为什么URI重定向不会发生。

有什么想法吗?

0 个答案:

没有答案