3

您好我正在尝试在我的 Windows 应用程序中调用 WCF 服务

我将服务引用添加到我的项目中,但在执行时出现以下错误:

这很可能是因为“http://tempuri.org/IUser/SaveUser”操作不正确,或者因为消息包含无效或过期的安全上下文令牌,或者因为绑定之间存在不匹配。如果服务由于不活动而中止通道,则安全上下文令牌将无效。为了防止服务过早中止空闲会话,请增加服务端点绑定的接收超时。

我尝试增加服务端点绑定的接收超时。但也有同样的例外。

这里是config file on client

<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IUser" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:30:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
                    transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:45:00"
                        enabled="false" />
                  <security mode="None">
                    <transport clientCredentialType="None" />
                  </security>

                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://t2.ipixsolutions.net/Service.svc" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_IUser" contract="ServiceReference1.IUser"
                name="WSHttpBinding_IUser">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

在服务器上配置

<system.serviceModel>
        <services>
      <service behaviorConfiguration="ServiceBehavior" name="WCFLibrary.Users">
                <endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser">
          <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ServiceBehavior">
                    <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                    <serviceMetadata httpGetEnabled="true"/>
                    <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
4

3 回答 3

2

嘿,我得到了同样的例外,在我的情况下,这是因为这个设置:

<security mode="None">

如果我将其更改为:

<security mode="Message">

它工作正常。我想它必须从默认值中获取,因为我没有在服务器端设置它。

于 2012-12-28T19:26:06.217 回答
0

我遇到了同样的问题并使用以下内容修改了安全元素

                <security mode="Message">
                    <transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm"
                        realm=""  />
                    <message clientCredentialType="Windows" algorithmSuite="Default" />
                </security>
  1. 我将安全模式从“无”修改为“消息”。
  2. 我将传输的 ClientCredentialType 从 "None" 修改为 "Ntlm" = clientCredentialType="Ntlm"
  3. 我将传输的 proxyCredentialType 从“None”修改为“Ntlm”= proxyCredentialType =“Ntlm”
于 2013-02-13T01:05:31.200 回答
0

也许这会对某人有所帮助。我在客户的 PC 上弹出了同样的错误。该应用程序在 10 次中有 9 次无法登录到我们的服务器。这适用于曾经完美运行的 WCF 客户端。罪魁祸首原来是一个广告软件应用程序,他一定是不小心安装了另一个软件。它将添加添加到 http 流中,这会破坏我们的通信。有问题的广告软件是 RocketTab ( http://malwaretips.com/blogs/rockettab-virus-removal/ )。

我们发现它的方法是注意到如果我们在他的 PC 上使用不同的 Windows 用户,问题就不会发生。然后,我们使用任务管理器关闭了他 PC 上看起来并不重要的进程,并发现当我们关闭 client.exe 进程时,我们的应用程序开始工作。这导致我们使用 RocketTab(他们的可执行文件是 client.exe)。

于 2014-10-14T12:06:56.473 回答