使用ninject.extensions.wcf在绑定依赖项时读取请求消息体

时间:2014-05-15 18:27:57

标签: c# wcf ninject ninject-extensions

我在WCF服务中使用Ninject.Extensions.Wcf,并且在我的项目中也有Ninject.Web.Common包。

在NinjectWebCommon类中,这是我绑定依赖项的方式

kernel.Bind<ISomething>().To<ConcreteSomething>();

直接绑定,一切正常..

现在,我想基于消息请求体中的一些成员来做解决方案,所以我创建了一个提供者

kernel.Bind<ISomething>().ToProvider<SomethingProvider>();

并且SomethingProvider尝试像这样读取请求消息

public class SomethingProvider : Provider<ISomething>
{
    protected override ISomething CreateInstance(IContext context)
    {
        var message = OperationContext.Current.RequestContext.RequestMessage;
        //message.State is Read here, so CreateBufferedCopy throws an InvalidOperationException.

        var buffer = message.CreateBufferedCopy(int.MaxValue);
        message = buffer.CreateMessage();
        var messageCopy = buffer.CreateMessage();
        var body = messageCopy.GetBody<string>();

        //Parse body, check some members and return one of the "Somethings"
        return new AnotherConcreteSomething();
    }
}

这会引发无效的操作异常。 operationcontext中的RequestMessage已处于读状态,因此我无法再次读取它。

我读到RequestMessage.ToString()并不总是可靠的,因为它会截断正文。而且,我将不得不从整个SOAP消息中获取正文。

还有其他方法吗?这种方法是否正确?

0 个答案:

没有答案