我在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消息中获取正文。
还有其他方法吗?这种方法是否正确?