我有自托管的WCF服务。当输入数据格式已知时,它可以作为魅力,但不是我的情况。
我的服务会像HTML表单一样被调用,但我不知道将要发送的参数的确切列表。
外部Web服务将发送内容为"a=foo&b=bar"
的HTTP请求,是,URL编码。内容中的参数可能不同。他们的数量可能不同。某些参数可能存在也可能不存在。所以我对完整的URL编码字符串完全没问题,我会自己解码。我必须用ASCII字符串“OK”回复。
如何从请求中访问此"a=foo&b=bar"
文本?我可以创建自己的编码器吗?怎么做的?
这是我开始时的合同:
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "test", BodyStyle = WebMessageBodyStyle.Bare)]
Stream TestPostRequest();
这是方法:
public Stream TestPostRequest() {
var maxByteSize = 16384;
var messageStream = new MemoryStream(maxByteSize);
var messageBuffer = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(maxByteSize);
messageBuffer.WriteMessage(messageStream);
var rawRequestData = new byte[maxByteSize];
messageStream.Read(rawRequestData, 0, maxByteSize);
var requestDataString = Encoding.UTF8.GetString(rawRequestData);
Console.WriteLine(requestDataString);
var responseData = new byte[2] { 79, 75 }; // OK
var responseStream = new MemoryStream(responseData);
return responseStream;
}
显然它不起作用,因为CreateBufferedCopy
方法期望XML作为输入数据,但获取URL编码的字符串。正如我发现的所有其他方法一样。
我并不害怕创建实现IEndpointBehavior
或IDispatchMessageInspector
的新类,但我只是看不到在哪里可以实现允许我以字节形式访问请求数据的内容,而不是XML。
也许我可以将原始数据转换为XML?
修改
我的错,我的操作堆栈中有一个破坏的行为,它严重地混淆了消息内容类型。道德是 - 在一个干净的测试项目中测试新功能。第二个道德是WCF可以一切;)第三个是:如果消息内部数据中没有XML - 你打破了它;)