在阅读了更多关于它并尝试实现wshttpbinding之后,它就不会发生。无论我尝试什么,我都会收到以下错误消息(安全模式已注释掉)。我理解为什么因为绑定之间的SOAP版本不同。
“(415)无法处理消息,因为内容类型'application / soap + xml; charset = utf-8'不是预期的类型'text / xml; charset = utf-8'”
我在以下链接中阅读了有关TransportWithMessageCredentials的更多信息:
http://msdn.microsoft.com/en-us/library/ms789011.aspx
但仍无法让它发挥作用。
我可以使用basicHttpBinding对内部应用程序很好并且工作得很好(如果我不包含任何事务),但是我在WCF层的应用程序仍然需要支持事务(见下文),我从中了解basicHttpBinding没有不支持,因为它不包含transactionflow属性。
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
当我尝试运行包含安全模式的下面的内容时,svc配置编辑器甚至没有启动并抛出以下错误:“System.InvalidOperationException:找不到与端点的方案https匹配的基址绑定WSHttpBinding。注册的基地址方案是[http]。“
我知道它期待某种SSL / https安全性,但我的网站(如下所示,是http)。这对于面向公众的网站来说没什么问题,但对于内部网站来说,目前我想做的就是支持交易。
这是wsHttpBinding的服务器端设置:
<bindings>
<wsHttpBinding>
<binding name="WsHttpBinding_IYeagerTechWcfService" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="24.20:31:23.6470000" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" transactionFlow="true">
<security mode="Transport" >
<transport clientCredentialType = "Windows" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<?xml version="1.0"?>
<services>
<clear />
<service name="YeagerTechWcfService.YeagerTechWcfService">
<endpoint address="" binding="wsHttpBinding" contract="YeagerTechWcfService.IYeagerTechWcfService" >
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://abc.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc" />
</baseAddresses>
</host>
</service>
</services>
这是我的客户端设置:
<?xml version="1.0"?>
<client>
<endpoint address="http://abc.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc"
binding="wsHttpBinding" contract="YeagerTechWcfService.IYeagerTechWcfService"
name="WsHttpBinding_IYeagerTechWcfService" />
</client>
请有人提供以下内容:
是否有其他方法可以在WCF中为basicHttpBinding或其他任何方式支持事务?
如果是这样,我该如何实施呢?
如果没有,我的选择是什么?
对于上述问题,我可能已经找到了答案,但希望由更有经验的人来处理。
我没有让WCF层处理事务(如上所述),我建议在将数据传递给WCF层时,在Controller中使用basicHttpBinding和以下代码:
// method here
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
{
db.EditCategory(cat);
// the above code would execute the EditCategory method below in the WCF layer and keep the transaction alive ts.Complete();
ts.Dispose();
}
return Json(new GridModel(db.GetCategories()));
// end method
WCF层:
public void EditCategory(Category cat)
{
try
{
using (YeagerTechEntities DbContext = new YeagerTechEntities())
{
Category category = new Category();
category.CategoryID = cat.CategoryID;
category.Description = cat.Description;
// do another db update here or in another method...
DbContext.Entry(category).State = EntityState.Modified;
DbContext.SaveChanges();
}
}
catch (Exception ex)
{
throw ex;
}
}
对于使用SSL的面向公众的网站,如何正确实施wsHttpBinding?
答案 0 :(得分:0)
使用WCF事务时遇到了同样的问题 我使用了Windows身份验证的Message安全性,并且不必设置任何证书。
<wsHttpBinding>
<binding name="WSHttpBinding_Transactional"
transactionFlow="true">
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None" />
</security>
</binding>
</wsHttpBinding>