我在使用消息检查器为我的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重定向不会发生。
有什么想法吗?