由于害怕提出一个已经在Stack Overflow上已经饱和的问题,我一直在滚动可能的解决方案并且没有更明智的如何实现我想要实现的目标,如果它确实可行,或者我是否有我的系统设计不正确。
这个问题不只是寻找解决方案,而是解释WCF在配置/定制不同端点时的一些复杂性(和误解)。
典型情景:基于网络的结帐系统,客户可以通过将javascript调用回服务器来更改其购物篮中产品的数量或大小等属性。服务器必须知道用户是谁,因此提供会话似乎是一个理想的解决方案。
WCF肯定是要走的路,因为这个场景可以在未来的日期扩展,以支持另一个终端,例如移动应用或其他服务。 (在我的问题范围之外,但验证我想使用WCF来对付传统的.Net Web服务)
我的上述问题是配置端点/绑定。
我玩过各种配置。似乎我需要上述绑定的组合,或者可能创建一个支持这些元素的自定义绑定?如果是这样,有没有很好的资源如何这样做?我试过创建一个自定义绑定并且失败了!
我已经阅读了其他一些问题的评论,这些问题表明您不应该通过Web脚本使用Sessions,WCF不支持它,或者正在实施的系统设计不正确。首先,WebServices支持这一点,所以我发现很难相信WCF没有,特别是因为它单独支持webscripts和会话(但不是在一起?在框中可能......)。如果我要使用会话之外的其他内容,那么它必须是基于令牌的系统才能识别用户,但这肯定是会话的真正含义吗?我可以建立这个,但它似乎重新创建了轮子。
这是我的Web.Config中的配置。我设置了3个端点来玩;一个基本的,一个支持会议和其他支持webscripts。 (webHttpBinding端点的地址是空白的,因为服务在调试模式下会返回错误 - 我也看到过几个人所说的这一点)
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="CustomerServiceAspNetAjaxBehavior">
<enableWebScript />
<!--<webHttp />-->
</behavior>
<behavior name="WebScript">
<enableWebScript />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="serviceBehavior">
<serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
</behavior>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<services>
<service behaviorConfiguration="serviceBehavior" name="CustomerService">
<endpoint address="basic" binding="basicHttpBinding" bindingConfiguration="basicBinding"
contract="CustomerService" />
<endpoint address="ws" binding="wsHttpBinding" bindingConfiguration="wsConfig"
contract="CustomerService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="" behaviorConfiguration="CustomerServiceAspNetAjaxBehavior"
binding="webHttpBinding" bindingConfiguration="webConfig" contract="CustomerService" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="basicBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="None"></security>
<readerQuotas maxStringContentLength="2147483647 "/>
</binding>
</basicHttpBinding>
<wsHttpBinding>
<binding name="wsConfig" transactionFlow="true">
<security mode="None" />
<reliableSession enabled="true" ordered="true"/>
</binding>
</wsHttpBinding>
<webHttpBinding>
<binding name="webConfig">
<security mode="None" />
</binding>
</webHttpBinding>
</bindings>
<client/>
</system.serviceModel>
这是我的服务接口,显示我已将SessionMode设置为Allow,而GetSession()返回当前会话ID,如果会话不可用,则返回null。
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
[ServiceContract(Namespace = "", ConfigurationName = "CustomerService", SessionMode = SessionMode.Allowed)]
public interface ICustomerService
{
[OperationContract()]
[WebGet()]
bool UpdateBasketItem(int index, int productId, int qty, int attribSize);
[OperationContract()]
[WebGet()]
string GetSession();
}
所以我长篇大论的问题是这个.. 我可以配置端点以启用webscript,以便我可以通过javascript访问服务,同时启用会话吗?我已经通过WCF测试客户端单独测试了端点,看到'ws'端点确实有会话,并且使用webHttpBinding的空白端点没有会话但可以从Javascript调用。
我知道可能没有“开箱即用”的绑定,所以我需要创建一个自定义绑定,还是我可以通过使用一些配置魔法来某种方式来变形上述两个端点?
答案 0 :(得分:2)
如果您正在寻找可以通过JavaScript轻松访问的服务技术,我会强烈考虑使用Asp.Net WEB API。这是一个创建web apis的伟大框架形式。
从客户端角度来看,它比wcf更容易访问,您可以利用标准的asp.net概念。 Cookie,会话,缓存等。
我相信web api甚至是为了回应在wcf中执行此操作的难度而创建的。
如果你需要SOAP支持,我只考虑wcf。