标签: basichttpbinding

WCF basicHttpBinding:回复客户端失败时回滚

我通过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 transactions basichttpbinding

6
推荐指数
1
解决办法
1348
查看次数

为什么Winforms托管的WCF服务是单线程的?

我有一个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()但现在该服务的行为似乎与我期望的一样。

c# wcf basichttpbinding winforms

5
推荐指数
1
解决办法
1643
查看次数

WCF NetTCPBinding与HttpBinding在线上发送的数据差异

假设我有一个服务暴露两个端点,第一个是NetTCPBinding,第二个是HttpBinding的任何风格.他们都实现完全相同的服务合同.

电线上发送的内容有什么区别?

  • 使用netTcp是我的消息仍然序列化为XML?或者我的对象的二进制表示?
  • 在收到消息的方面有什么区别?http端点是否只能理解http命令(get/post等),因为nettcp端点可以理解不同的东西?
  • 为什么nettcp比http更高效(在这种情况下我不需要互操作性) - 哪里是开销?

我认为在所有情况下,在将消息放到线路上之前它将被转换为二进制文件,因此http在网络术语中也位于tcp之上 - 因此http通信需要额外的空间.

欣赏这个问题有点模糊,但希望有人会知道我想问的是什么:)

wcf basichttpbinding wcf-binding wshttpbinding nettcpbinding

5
推荐指数
1
解决办法
8334
查看次数

WCF + Silverlight + HttpContext.Current.Session为null

我的问题....

我正在尝试从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)

silverlight session wcf basichttpbinding

5
推荐指数
1
解决办法
4406
查看次数

长轮询ACTUALLY如何在客户端上调用回调?

客户端启动长轮询,在服务器上调用一个方法,并传入一个AsyncCallback包含回调委托的实例,当服务器异步返回客户端时将调用该委托.

现在我对此的理解是有限的,但似乎在BasicHttpWCF中AsyncCallback参数被序列化并发送到服务器,然后服务器对其进行反序列化,缓存它并最终调用它以"返回"到客户端.

首先,上述解释是否正确?其次,如何AsyncCallback通过网络在客户端上调用?

c# wcf basichttpbinding long-polling

5
推荐指数
1
解决办法
1810
查看次数

将HTTP请求发送到https时发生错误 - >握手失败

我正在使用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)

c# wcf basichttpbinding

5
推荐指数
1
解决办法
2万
查看次数

如何在BasicHttpBinding中的WCF服务中进行身份验证?

我正在使用basicHttpBinding开发WCF服务,这些服务应该可以使用.net 1.1和.net 2.0访问,为此我使用basicHttpBinding.
在旧的ASMX Web服务中,我选择了一个Soap Header(AuthHeader)来对每个请求的用户进行身份验证.

如何使用basicHttpBinding在WCF中进行身份验证?任何样本或教程都会有所帮助.


NRK

wcf basichttpbinding wcf-authentication wcf-security

4
推荐指数
1
解决办法
2万
查看次数

如何配置具有两个端点的WCF服务,以便为每个端点使用不同的ListenUri?

我有一个WCF服务,使用它来公开端点webHttpBinding,并由WPF和ASP.NET应用程序使用.一切都很好.

我现在正试图从Windows Phone(WP7)中使用该服务.但是,由于.NET Framework还没有完全赶上WP7,因此System.ServiceModel.Web命名空间不可用,结果是webHttpBinding在WP7中不起作用.

现在,在我的服务上,如果我将其切换webHttpBinding为a basicHttpBinding,则手机应用程序可以运行.

我不想重写我的WPF和ASP.NET应用程序来使用basicHttpBinding它.

据我所知,WCF能够支持多个绑定,我试图配置和运行服务,从而可以显示端点都webHttpBindingbasicHttpBinding.该服务似乎启动良好.但是,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)

wcf basichttpbinding webhttpbinding windows-phone-7

4
推荐指数
1
解决办法
9947
查看次数

通过SSL使用纯文本用户名凭据为第三方SOAP 1.1服务配置WCF客户端

我正在尝试连接到需要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)]:找不到安全标头.

如何配置我的客户端以连接到此服务?

  • WS Security使用SSL上的纯文本密码

wcf ws-security soap basichttpbinding wcf-security

4
推荐指数
1
解决办法
4459
查看次数

如何在WCF服务中启用HTTPS

我在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)

https wcf basichttpbinding wcf-security wcf-configuration

4
推荐指数
1
解决办法
2万
查看次数