2015-10-18 108 views
1

我创建了几个WCF REST服务,它们接受JSON对象请求并返回JSON对象响应。获取WCF REST服务的RAW请求字符串

Public Function SaveClientInformation(info as ClientInformation) As Boolean Implements IContactInformation.SaveClientInformation 
    'Here info object is the de-serialized JSON that was sent 

    'At this point we also need access to the RAW JSON string that was sent from the Java client 
    dim rawJSONRequest = ? 

    'We take the info object and persist it out postgress database 

End Function 

我需要从Web服务方法捕获原始JSON字符串。 目前我有权访问反序列化的对象,但我还需要提交给Web服务的RAW JSON字符串。

我已经看过WCF文档并环顾四周,不幸的是这似乎不可能。 WCF不允许我访问发送到服务器的RAW请求(字符串)。

我已经尝试创建一个WCF消息拦截器,但是这并不能让我访问RAW请求字符串,我也需要从Web服务方法访问这个RAW字符串。

我需要访问RAW字符串以及来自Web服务方法的反序列化的JSON对象。

这是可能的WCF?

我知道这可以使用较新的ASP.NET Web API来实现。但我无法更改我们的应用程序,因为我们的所有Web服务都是基于WCF REST(JSON)构建的,并且它们被许多客户端使用。

RAW请求是必需的,因为在客户端,请求RAW字符串由Java散列,并且散列在标头中发送。因此访问这个RAW请求的主要原因是重新计算哈希以检查在传输过程中消息是否未被更改。我们正在使用HTTP,但是我们需要保证消息不被干扰,这是我们其他Java Web服务中已经实现的技术,我们需要在.NET中完成确切的事情。 WCF REST也是如此。

+0

可以使用代码 –

+0

增加更多的细节希望示例代码就足够了。请让我知道你还需要什么,非常感谢你的帮助。 –

+0

根本没有请求字符串。在WCF管道中的某个点,你有请求字节(byte []),然后由消息编码器读取,然后转换为消息对象。即使您在消息拦截器中访问这些字节,这也会是不同的层,这与业务逻辑层无关。考虑将输入参数类型更改为字符串(如果可能),并在服务端自己将其解析为JSON。 – Mimas

回答

0

您可以通过阅读Request.InputStream来访问请求内容。 这需要在Web.Config中打开aspNetCompatibilityEnabled =“true”设置。

见下文:

Dim requestContent = [String].Empty 
    Dim requestStream = System.Web.HttpContext.Current.Request.InputStream 
    Dim originalPosition = requestStream.Position 

    Using reader = New System.IO.StreamReader(requestStream) 
     requestContent = reader.ReadToEnd() 
    End Using 

    requestStream.Seek(originalPosition, SeekOrigin.Begin) 
    Return requestContent 
+0

谢谢先生,工作 –