首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >访问RESTful服务中的请求正文

访问RESTful服务中的请求正文
EN

Stack Overflow用户
提问于 2009-08-17 12:53:53
回答 9查看 55.7K关注 0票数 18

如何访问WCF REST服务中的HTTP POST请求正文?

以下是服务定义:

代码语言:javascript
运行
复制
[ServiceContract]
public interface ITestService
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "EntryPoint")]
    MyData GetData();
}

具体实现如下:

代码语言:javascript
运行
复制
public MyData GetData()
{
    return new MyData();
}

我想使用以下代码来访问HTTP请求:

代码语言:javascript
运行
复制
IncomingWebRequestContext context = WebOperationContext.Current.IncomingRequest;

但是IncomingWebRequestContext只提供对头的访问,而不提供主体的访问。

谢谢。

EN

Stack Overflow用户

发布于 2009-08-17 14:29:41

我为之前的回答道歉,我愚蠢地认为我只是为了在OperationContext上使用WebOperationContext,不幸的是,真正的答案要丑陋得多。

让我开始吧,一定有更好的方法!

首先,我创建了自己的context对象,可以附加到现有的OperationContext对象上。

代码语言:javascript
运行
复制
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;
                }
            }
        }
}

为了能够访问这个新的上下文对象,您需要将其添加为当前上下文对象的扩展。我通过创建一个消息检查器类来做到这一点。

代码语言:javascript
运行
复制
public class TMMessageInspector : IDispatchMessageInspector {

        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) {

            OperationContext.Current.Extensions.Add(new TMRequestContext());
            return null;
        }
}

为了让消息检查器工作,你需要创建一个新的“行为”。我使用下面的代码实现了这一点。

代码语言:javascript
运行
复制
    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。我隐约记得它总是空的,这个讨厌的进程是我获得一个实际包含有效数据的实例的唯一方法。

票数 0
EN
查看全部 9 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1287802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档