如何访问WCF REST服务中的HTTP POST请求正文?
以下是服务定义:
[ServiceContract]
public interface ITestService
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "EntryPoint")]
MyData GetData();
}具体实现如下:
public MyData GetData()
{
return new MyData();
}我想使用以下代码来访问HTTP请求:
IncomingWebRequestContext context = WebOperationContext.Current.IncomingRequest;但是IncomingWebRequestContext只提供对头的访问,而不提供主体的访问。
谢谢。
发布于 2009-08-17 14:29:41
我为之前的回答道歉,我愚蠢地认为我只是为了在OperationContext上使用WebOperationContext,不幸的是,真正的答案要丑陋得多。
让我开始吧,一定有更好的方法!
首先,我创建了自己的context对象,可以附加到现有的OperationContext对象上。
public class TMRequestContext : IExtension<OperationContext> {
private OperationContext _Owner;
public void Attach(OperationContext owner) {
_Owner = owner;
}
public void Detach(OperationContext owner) {
_Owner = null;
}
public static TMRequestContext Current {
get {
if (OperationContext.Current != null) {
return OperationContext.Current.Extensions.Find<TMRequestContext>();
} else {
return null;
}
}
}
}为了能够访问这个新的上下文对象,您需要将其添加为当前上下文对象的扩展。我通过创建一个消息检查器类来做到这一点。
public class TMMessageInspector : IDispatchMessageInspector {
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) {
OperationContext.Current.Extensions.Add(new TMRequestContext());
return null;
}
}为了让消息检查器工作,你需要创建一个新的“行为”。我使用下面的代码实现了这一点。
public class TMServerBehavior : IServiceBehavior {
public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) {
//Do nothing
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) {
foreach (ChannelDispatcher chDisp in serviceHostBase.ChannelDispatchers) {
foreach (EndpointDispatcher epDisp in chDisp.Endpoints) {
epDisp.DispatchRuntime.MessageInspectors.Add(new TMMessageInspector());
}
}
}
}您应该能够在配置文件中添加行为,尽管我是通过创建新主机并在OnOpening方法中手动添加behaviour对象来实现的。我最终使用这些类的目的不仅仅是访问OperationContext对象。我使用它们来记录和覆盖错误处理以及对http请求对象的访问等。因此,它并不像看起来那么可笑。差不多了,但不完全是!
我真的不记得为什么我不能直接访问OperationContext.Current。我隐约记得它总是空的,这个讨厌的进程是我获得一个实际包含有效数据的实例的唯一方法。
https://stackoverflow.com/questions/1287802
复制相似问题