Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何?Https上的WCF自定义绑定_Wcf_Binding_Https - Fatal编程技术网

如何?Https上的WCF自定义绑定

如何?Https上的WCF自定义绑定,wcf,binding,https,Wcf,Binding,Https,我正在尝试在我们面向外部的web场上设置一个供内部使用的WCF服务(我们内部没有web场,我需要这个服务来进行故障切换和负载平衡) 要求: PerSession状态,因为我们需要服务为每个会话保留可变数据 HTTPS。在谷歌搜索了很多内容后,我读到我需要创建一个customBinding,我已经完成了,但不确定它是否正确 更大的消息大小,因为其中一个参数是byte[]数组,最大为5mb 不需要手动编辑客户端app.config。也就是说,我需要开发人员只添加服务引用,然后开始使用该对象,而不需

我正在尝试在我们面向外部的web场上设置一个供内部使用的WCF服务(我们内部没有web场,我需要这个服务来进行故障切换和负载平衡)

要求:

  • PerSession状态,因为我们需要服务为每个会话保留可变数据
  • HTTPS。在谷歌搜索了很多内容后,我读到我需要创建一个customBinding,我已经完成了,但不确定它是否正确
  • 更大的消息大小,因为其中一个参数是byte[]数组,最大为5mb
  • 不需要手动编辑客户端app.config。也就是说,我需要开发人员只添加服务引用,然后开始使用该对象,而不需要对app.config进行任何修改
注意:我以前已经让这个服务在HTTP下正常工作(使用wsHttpBinding)。 我也让它在HTTPS下工作,但它不支持PerSession状态,并且每次函数调用都会丢失内部变量值

我当前从测试线束中得到此错误:

在ServiceModel客户端配置节中找不到引用约定“AppMonitor.IAppMonitorWcfService”的默认终结点元素。这可能是因为找不到应用程序的配置文件,或者在客户端元素中找不到与此约定匹配的端点元素

注意:错误发生在测试线束EXE上,该测试线束EXE直接在“服务引用”下引用WCF服务。这不是exe引用另一个对象的问题,然后引用WCF服务,我已经读过

浏览URL时,WSDL显示正确

Web.Config:

  <system.serviceModel>
    <services>
      <service name="AppMonitor.AppMonitorWcfService" behaviorConfiguration="ServiceBehavior">
        <endpoint address="" binding="customBinding" bindingConfiguration="EnablePerSessionUnderHttps" contract="AppMonitor.IAppMonitorWcfService"/>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <bindings>
      <customBinding>
        <binding name="EnablePerSessionUnderHttps" maxReceivedMessageSize="5242880">
          <reliableSession ordered="true"/>
          <textMessageEncoding>
            <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          </textMessageEncoding>
          <httpsTransport authenticationScheme="Anonymous" requireClientCertificate="false"/>
        </binding>
      </customBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" httpGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

EXE的App.config(添加服务引用时自动生成):


我不确定app.config为什么显示wsHttpBinding?这不应该是定制的吗? 我真的不想编辑app.config,因为这项服务将被几十个开发人员使用,我希望他们能够添加服务引用,然后他们就离开了

使用VS2008、.NET3.51。
我认为服务器是IIS7,Win server 2008,如果需要可以确认。

好的,您的问题是您没有为您的服务定义地址。记住端点的ABC:地址绑定契约

您需要为服务定义一个地址,该地址基本上由.svc文件控制,并且可以从IIS浏览该文件。无论该.svc文件的URL是什么,您都会附加您定义的地址(在本例中为空字符串),然后将其添加到顶部。因此,如果我将myservice.svc文件放在根目录中,它将变为

https://localhost/myservice.svc/

在您的情况下,
ServiceAddress=“
所以URL是
https://localhost/myservice.svc/


有关更多信息,请参阅。

web.config中有一个地址,因此我假设您的意思是客户端app.config中缺少该地址?为什么它不见了?我所做的只是在addservicereference选项中键入相同的URL(我可以浏览并查看WSDL页面),然后它找到了服务。然后我键入一个名称空间,单击GO,就这样了。这就是我过去做WCF的方式。你知道为什么它没有把地址放在app.config中吗?好的,很明显问题是客户端app.config的标签下没有任何信息。我知道,我需要知道a)为什么在执行“添加服务引用”时没有自动填充;b) 如何让它自动填充?c) 或者,更改web.config绑定或其他内容,使其像之前一样自动填充。使用我们的服务的开发者不必编辑他们的app.configs来使用此服务,这是必须的。他们应该能够在addservicereference中输入URL,然后开始使用该服务。谢谢你的帮助!注意:我读到我必须从这篇文章中创建一个customBinding:。我还了解到,我遇到的端点详细信息未填充到clients app.config的问题是由于绑定问题(但没有提供解决方案)。我是否可以使用wsHttpBinding(或其他?),并且仍然可以通过https使用PerSession上下文?
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="CustomBinding_IAppMonitorWcfService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10: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:10:00"
                        enabled="true" />
                    <security mode="Transport">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client />
    </system.serviceModel>
</configuration>