是否可以使用JSON作为请求和响应格式来支持会话?
我需要保护我的应用程序,该应用程序当前正在以JSON格式与WCF服务器进行通信并对每次调用进行身份验证。
我想只在登录时进行身份验证,然后在会话中处理其余的请求,但是当我尝试创建这样的服务时,我需要将绑定更改为wsHttpBinding或netTCPBinding,并且当下我这样做,服务器不再接受我的JSON请求。但它接受来自我用C#编写的测试客户端的请求,只需使用“添加服务引用”工具。
使用fiddler,我发现C#客户端通过大量膨胀的XML与我的服务进行通信。
这是我的web.config:
<?xml version="1.0"?>
<configuration>
<system.web>
<!--
Set compilation debug="true" to insert debugging
symbols into the compiled page. Because this
affects performance, set this value to true only
during development.
-->
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5cxxxxxxe089"/>
</assemblies>
</compilation>
<!--
The <authentication> section enables configuration
of the security authentication mode used by
ASP.NET to identify an incoming user.
-->
<authentication mode="Windows"/>
<!--
The <customErrors> section enables configuration
of what to do if/when an unhandled error occurs
during the execution of a request. Specifically,
it enables developers to configure html error pages
to be displayed in place of a error stack trace.
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
</system.web>
<!--
The system.webServer section is required for running ASP.NET AJAX under Internet
Information Services 7.0. It is not necessary for previous version of IIS.
-->
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MobiServiceLibrary.MobiServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<!--<endpointBehaviors>
<behavior name="MobiServiceLibrary.MobiServiceBehavior">
<webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json" automaticFormatSelectionEnabled="true"/>
</behavior>
</endpointBehaviors>-->
</behaviors>
<services>
<service behaviorConfiguration="MobiServiceLibrary.MobiServiceBehavior" name="MobiServiceLibrary.MobiService">
<endpoint address="" binding="wsHttpBinding" contract="MobiServiceLibrary.IMobiService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<!--<serviceHostingEnvironment multipleSiteBindingsEnabled="true" minFreeMemoryPercentageToActivateService="1">
</serviceHostingEnvironment>-->
</system.serviceModel>
</configuration>
我的登录“合同”:
[ServiceContract(SessionMode = SessionMode.Required)]
public partial interface IMobiService
{
[OperationContract(IsInitiating=true)]
[WebInvoke(Method = "POST", UriTemplate = "/Login", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat=WebMessageFormat.Json, RequestFormat=WebMessageFormat.Json)]
userData login(string pUserName, string pPassword, string pDeviceType);
}
我的登录'实施':
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,AddressFilterMode=AddressFilterMode.Any)]
public partial class MobiService : IMobiService
{
public userData login(string pUserName, string pPassword, string pDeviceType)
{
//Do Login
}
}
答案 0 :(得分:0)
您的wcf服务是否标记为scriptService?
此WCFService是托管在IIS服务器上还是仅托管在服务主机上。我不知道服务主机如何管理身份验证。我知道它适用于IIS
从您的应用中调用登录服务。如果成功,将会有一个由IIS创建的会话cookie,您可以从应用程序中的响应中获取该cookie。缓存该cookie并将其设置在您从应用程序生成的每个后续服务请求中
答案 1 :(得分:0)
我将尝试回答我自己的问题,请随时指出我是否仍然错了。
在做了一些谷歌搜索之后,我发现了这个:BasicHttpBinding vs WsHttpBinding vs WebHttpBinding
这就解释了为什么我在以JSON格式破坏Sessionful服务时遇到了麻烦。 似乎绑定是主要问题: webHttpBinding 用于纯RestFul服务,并且与JSON配合良好,服务和客户端之间几乎没有包装请求和响应,建议进行每次呼叫重新认证。 basicHttpBinding 和 wsHttpBinding 都用于为服务添加其他功能和安全性(wsHttpBinding更新,功能更多)。 如果我理解正确, 基本绑定和ws绑定都依赖于SOAP + XML以支持其他功能,其中一个功能是会话支持 。
因此,basicHttpBinding和wsHttpBinding服务,每个定义不是RESTful,webHttpBinding服务不支持会话。
所以我的选择是:
我现在倾向于选项2。
我仍然会感谢任何评论,建议和/或批评,以及任何有助于我更好地理解这一点的内容。
问候!