我通过basicHttpBinding在数据库上执行多个操作来公开WCF服务.
我想保证,如果客户端没有收到回复,则回滚数据库操作(没有任何事务流通过WCF).例如,客户端调用在服务器上执行但在完成之前客户端崩溃的"DoX"方法.一旦无法将回复发送到客户端,就应该回滚数据库操作.
有没有办法做到这一点?[OperationBehavior(TransactionScopeRequired=true)]属性是否会以这种方式工作?是否有可能处理服务器端的通信错误?
更新1:
似乎[OperationBehavior(TransactionScopeRequired=true)]在将回复发送到客户端之前提交事务,因此如果客户端没有收到回复,则不能用于执行回滚.
更新2: 要再次明确说明,我不需要事务以任何方式与客户端进行交互.客户端既不知道事务,也不能取消或提交事务,任何事务都不应该通过绑定.如果传输通道无法将消息传递到接收客户端,那么我希望事务回滚的唯一位置是在服务器端.对于TCP/IP的情况,该信息应该随时可供服务器使用.(没有TCP数据包的ACK发送回客户端)
因此,服务器端的假设执行流程(请注意缺少客户端)应该是:
Receive client request
Start transaction
Execute all logic inside the service operation
Send reply back to client
if (reply.failedToReceive) { transaction.Rollback() } // due to a failing TCP/IP transmission
Run Code Online (Sandbox Code Playgroud) 我有一个WCF服务,用于替换旧的ASP.NET Web服务。该服务似乎运行正常,但由于某种原因无法处理同时请求。我对服务的实现具有以下属性:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HHService : IHHService
Run Code Online (Sandbox Code Playgroud)
我的主机声明如下:
baseAddress = new Uri("http://0.0.0.0:8888/HandHeld/");
host = new ServiceHost(typeof(HHService), baseAddress);
ServiceMetadataBehavior behavior;
behavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (behavior == null)
{
behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
behavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(behavior);
}
host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
host.AddServiceEndpoint(typeof(IHHService), new BasicHttpBinding(), "HHService.asmx");
HHService.LogMessage += new EventHandler<HHService.LogMessageEventArgs>(HHService_LogMessage);
host.Open();
Run Code Online (Sandbox Code Playgroud)
该服务将运行并返回正确的结果,但是如果两个客户端尝试同时进行呼叫,则一个客户端将阻塞直到另一个客户端完成,而不是一起执行呼叫。我没有使用任何配置文件。我正在尝试以编程方式进行所有操作。我是否有某些错误设置导致此行为?我已经使用NetTCPBinding运行了其他服务,而没有出现此问题。
编辑: 回应约翰·桑德斯:我不熟悉任何ASP.NET兼容模式。我没有使用任何会话状态,该服务是无状态的,它只是处理请求。除了实现实际方法之外,我所做的所有其他事情都在此处列出的代码中。
可能的解决方案:
我host.Open()从主窗体的form_load事件调用该函数。我将调用移到一个单独的线程。所有这些线程所做的只是调用,host.Open()但现在该服务的行为似乎与我期望的一样。
假设我有一个服务暴露两个端点,第一个是NetTCPBinding,第二个是HttpBinding的任何风格.他们都实现完全相同的服务合同.
电线上发送的内容有什么区别?
我认为在所有情况下,在将消息放到线路上之前它将被转换为二进制文件,因此http在网络术语中也位于tcp之上 - 因此http通信需要额外的空间.
欣赏这个问题有点模糊,但希望有人会知道我想问的是什么:)
wcf basichttpbinding wcf-binding wshttpbinding nettcpbinding
我的问题....
我正在尝试从Silverlight和WCF basicHttpBinding访问会话...
我看到了一些可能的帖子(http://www.dotnetspider.com/Silverlight-Tutorial-317.aspx)
Mys cenario是:
Silvelright 4 FW 3.5
在web.config我有
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="ViewModelDemo.Web.Service1Behavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="ViewModelDemo.Web.Service1Behavior" name="ViewModelDemo.Web.Service1">
<endpoint address="" binding="basicHttpBinding" contract="ViewModelDemo.Web.Service1">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
和我的服务:
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class Service1
{
[OperationContract]
publicvoid Test()
{
var session = System.Web.HttpContext.Current.Session;
}
}
Run Code Online (Sandbox Code Playgroud)
这是电话
var client = new Service1Client();
client.GetUserMacroFunctionsCompleted += new System.EventHandler<GetUserMacroFunctionsCompletedEventArgs>(client_GetUserMacroFunctionsCompleted);
client.GetUserMacroFunctionsAsync(); …Run Code Online (Sandbox Code Playgroud) 客户端启动长轮询,在服务器上调用一个方法,并传入一个AsyncCallback包含回调委托的实例,当服务器异步返回客户端时将调用该委托.
现在我对此的理解是有限的,但似乎在BasicHttpWCF中AsyncCallback参数被序列化并发送到服务器,然后服务器对其进行反序列化,缓存它并最终调用它以"返回"到客户端.
首先,上述解释是否正确?其次,如何AsyncCallback通过网络在客户端上调用?
我正在使用basicHttpsbinding如下的web服务
EXCClient CreateClient()
{
var binding = new System.ServiceModel.BasicHttpsBinding();
binding.ReaderQuotas.MaxArrayLength = int.MaxValue;
binding.MaxReceivedMessageSize = int.MaxValue;
binding.UseDefaultWebProxy = false;
var endpoint = new System.ServiceModel.EndpointAddress("https://{siteName}/{service}");
var client = new EXCClient(binding, endpoint);
return client;
//return new EXCClient();
}
Run Code Online (Sandbox Code Playgroud)
使用站点托管在IIS 7.5上,并且在服务器上有多个站点.我正在使用.net表单站点,调用代码如下所示
var x = service.Client.GetResults({parameter});
Run Code Online (Sandbox Code Playgroud)
运行此服务时将返回大约15分钟的结果,然后开始出现此错误.
将HTTP请求发送到https:// {siteName}/{service} /时发生错误.这可能是由于在HTTPS情况下未使用HTTP.SYS正确配置服务器证书.这也可能是由客户端和服务器之间的安全绑定不匹配引起的
底层连接已关闭:发送时发生意外错误.---> System.IO.IOException:由于意外的数据包格式,握手失败.
如果我为站点回收应用程序池,则服务开始再次返回结果大约15分钟,然后再次开始失败.我的应用程序池没有内存限制.
的app.config模样
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_EXC">
<security mode="Transport" />
</binding>
<binding name="BasicHttpBinding_EXC1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://vadrs.tax.utah.gov/vdx/" binding="basicHttpsBinding"
bindingConfiguration="BasicHttpBinding_EXC" contract="UTVehicleServices.EXC"
name="BasicHttpBinding_EXC" />
</client>
Run Code Online (Sandbox Code Playgroud) 我正在使用basicHttpBinding开发WCF服务,这些服务应该可以使用.net 1.1和.net 2.0访问,为此我使用basicHttpBinding.
在旧的ASMX Web服务中,我选择了一个Soap Header(AuthHeader)来对每个请求的用户进行身份验证.
如何使用basicHttpBinding在WCF中进行身份验证?任何样本或教程都会有所帮助.
NRK
我有一个WCF服务,使用它来公开端点webHttpBinding,并由WPF和ASP.NET应用程序使用.一切都很好.
我现在正试图从Windows Phone(WP7)中使用该服务.但是,由于.NET Framework还没有完全赶上WP7,因此System.ServiceModel.Web命名空间不可用,结果是webHttpBinding在WP7中不起作用.
现在,在我的服务上,如果我将其切换webHttpBinding为a basicHttpBinding,则手机应用程序可以运行.
我不想重写我的WPF和ASP.NET应用程序来使用basicHttpBinding它.
据我所知,WCF能够支持多个绑定,我试图配置和运行服务,从而可以显示端点都webHttpBinding和basicHttpBinding.该服务似乎启动良好.但是,WPF和ASP.NET应用程序无法访问它.当我尝试在WP7应用程序中创建服务引用时,我收到以下消息:
绑定实例已与侦听URI"http:// localhost:1726/GeneralService.svc"关联.如果两个端点想要共享相同的ListenUri,则它们还必须共享相同的绑定对象实例.两个冲突的端点要么在AddServiceEndpoint()调用中,在配置文件中指定,要么在AddServiceEndpoint()和config的组合中指定.
一位同事和我都打得四处多种变化的baseAddress,address以及listenUri没有任何的运气属性.我们现在正处于试验和错误的阶段,这并不是非常有效.
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<bindings>
<basicHttpBinding>
<binding name="generalBasic" />
</basicHttpBinding>
<webHttpBinding>
<binding name="general" maxReceivedMessageSize="2147483647">
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" />
<security mode="None">
<transport clientCredentialType="None" />
</security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="MyProject.GeneralService"> …Run Code Online (Sandbox Code Playgroud) 我正在尝试连接到需要SSL安全性和用户名/密码凭据的第三方SOAP 1.1服务.预期的一个例子是:
<soapenv:Header>
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username>username</wsse:Username>
<wsse:Password>password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
Run Code Online (Sandbox Code Playgroud)
我的客户端配置如下:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="thirdpartyservicebindingconfig">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName"
algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://..."
binding="basicHttpBinding"
bindingConfiguration="thirdpartyservicebindingconfig"
contract="thirdpartyservicecontract"
name="thirdpartyserviceendpoint" />
</client>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
服务客户端代码是:
var client = new thirdpartyservicecontractclient();
client.ClientCredentials.UserName.UserName = "username";
client.ClientCredentials.UserName.Password = "password";
var result = client.DoSomething();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误异常消息:
安全处理器无法在消息中找到安全标头.这可能是因为消息是不安全的故障,或者因为通信方之间存在绑定不匹配.如果为安全性配置服务并且客户端未使用安全性,则会发生这种情况.
编辑:
如果我将安全模式重新配置为"传输":
<security mode="TransportWithMessageCredential">
我从第三方服务收到错误:
com.sun.xml.wss.XWSSecurityException:消息不符合已配置的策略[AuthenticationTokenPolicy(S)]:未找到安全标头; 嵌套异常是com.sun.xml.wss.XWSSecurityException:com.sun.xml.wss.XWSSecurityException:消息不符合已配置的策略[AuthenticationTokenPolicy(S)]:找不到安全标头.
如何配置我的客户端以连接到此服务?
我在IIS上托管了我的服务.
托管服务已应用SSL证书,在浏览URL时,它显示为HTTPS.
但是,当我将此URL用于客户端应用程序(ASP.NET WEB应用程序)时,它允许添加,https//domain/service.svc但在客户端配置中,它会显示URL http而不是https.什么时候手动更改,它会给出如下错误:The provided URI scheme 'https' is invalid; expected 'http'.
以下是WCF服务配置(在IIS上托管):
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="customBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="basicBindingConfiguration" closeTimeout="00:05:00"
openTimeout="00:05:00" receiveTimeout="00:10:00" sendTimeout="00:05:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
</security>
</binding>
</basicHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" minFreeMemoryPercentageToActivateService="0" />
<services>
<service name="Administrator.OAP.CRMServices.CRMServices"
behaviorConfiguration="customBehavior">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="basicBindingConfiguration"
contract="Administrator.OAP.CRMServices.Contracts.ICRMServices" />
</service> …Run Code Online (Sandbox Code Playgroud) basichttpbinding ×10
wcf ×10
c# ×3
wcf-security ×3
https ×1
long-polling ×1
session ×1
silverlight ×1
soap ×1
transactions ×1
wcf-binding ×1
winforms ×1
ws-security ×1