从Webpart连接WCF

时间:2010-04-20 06:27:41

标签: c# wcf sharepoint web-parts

我正在使用Sharepoint 2007中的webpart使用WCF服务。但是它给了我以下错误:

  

没有终点收听   http://locathost:2929/BusinessObjectService   那可以接受这个消息。这是   通常由不正确的地址引起   或SOAP动作。请参阅InnerException,if   目前,了解更多详情。 --->   System.Net.WebException:远程   服务器返回错误:(404)不是   找到。

WCF web.config中的My Binding Details是:

<system.serviceModel>
    <diagnostics performanceCounters="All">
      <messageLogging logEntireMessage="true" logMessagesAtServiceLevel="false"
        maxMessagesToLog="4000" />
    </diagnostics>
    <services>
      <service behaviorConfiguration="MyService.IBusinessObjectServiceContractBehavior"
        name="MyService.BusinessObjectService">
        <endpoint address="http://localhost:2929/BusinessObjectService.svc"
          binding="wsHttpBinding" contract="MyService.IBusinessObjectServiceContract">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyService.IBusinessObjectServiceContractBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Sharepoint站点web.config中的我的绑定详细信息是:

<system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_IBusinessObjectServiceContract"
                    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="Mtom" 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="false" />
          <security mode="Message">
            <transport clientCredentialType="Windows" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
                algorithmSuite="Default" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:2929/BusinessObjectService.svc"
          binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IBusinessObjectServiceContract"
          contract="BusinessObjectService.IBusinessObjectServiceContract"
          name="WSHttpBinding_IBusinessObjectServiceContract">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>

我可以使用终点中给出的URL在浏览器中查看WCF(及其wsdl)。所以,我猜这个网址肯定是正确的。请帮忙!!!

2 个答案:

答案 0 :(得分:1)

我已经复制了你的代码并且它正确地为我运行,但是有一些差异。

首先,您提供的服务器端配置不完整。端点mex失败,因为我没有IMetadataExchange合同。当您浏览到WSDL时,这可能是您正在查看的端点。

我只是完全删除了这个端点。接下来,我在这样的行为中指定serviceMetadata元素的地址:

<serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:2929/BusinessObjectService.svc?wsdl" />

不理想,但它让我发现这项服务。然后我生成的客户端配置文件与您的相同,除了......

其次,我有messageEncoding="Text"而不是messageEncoding="Mtom"

尝试将messagingEncoding更改为Text。您没有在服务器端指定它应该是Mtom,所以我不明白为什么它在客户端生成为Mtom。

除了这两个问题,我的配置与您的配置相同,并且运行没有问题。我不确定我发现的第二个问题是一个真正的问题(我无法看到元数据交换如何给出错误的消息编码),但第一个问题是阻止服务在我身边运行

答案 1 :(得分:0)

我收到的错误与所描述的错误几乎相同。但是我的错误是503,我在外部服务器上调用了一个Web服务。

当我从一个独立应用程序调用该服务时,我没有遇到任何问题,但是当我从SharePoint中的Web部件调用该服务时,它失败了。

对我有用的解决方案,没有任何进一步的解释,因为我还没有真正深入研究它的工作原理(如果你知道的话,请赐教:) :)

对我有用的

第一个解决方案是使用我自己的域帐户而不是SPWebApplication使用的应用程序池的服务帐户。

第二解决方案是将服务绑定属性UseDefaultWebProxy设置为false

UseDefaultWebProxy = false

当然,这些解决方案取决于您的代理设置和用户设置。我的代理设置被设置为绕过我正在呼叫的服务的代理,所以我怀疑代理设置(在此配置:IE-> Internet选项 - >连接 - > LAN设置)不适用于服务帐户,但仅限于登录用户。到目前为止,这是我将要进行更多调查的内容。

编辑1: 嗯。这实际上没有带来任何新的东西,我用psexec查看我的代理设置作为服务帐户(netsh-&gt; winhttp-&gt;显示代理),看起来是正确的,所以我不认为这可能是问题。

编辑2: 最终解决方案,所以问题是我的SP网络应用程序没有使用我在IE中设置的代理设置,当应用程序池在服务帐户的上下文中运行时,我使用了我的用户帐户对于应用程序池我没有问题,并使用IE中的代理设置。经过一番调查后,似乎我可以在web.config中为我的SPWebApplication定义代理设置,我选择了只是禁用代理

<system.net> <defaultProxy enabled="false" /> </system.net>