将启用Ajax的WCF服务暴露给C#代码

时间:2012-03-28 22:52:50

标签: c# .net wcf asp.net-ajax

我创建了一个“支持Ajax的WCF服务”。我可以从javascript代码中使用该服务,并且WebService按预期工作。但是,我想围绕它写ATP。所以,我将web服务作为“服务参考”添加到我的ATP项目中。然后我像往常一样使用web服务。这一切都很好。但是当我运行ATP时,它会让我重新回到这个错误

“System.InvalidOperationException:无法在ServiceModel客户端配置部分找到名称为”ServiceReference1.IWCFService“且收缩”ServiceReference1.IWCFService“的端点元素。这可能是因为找不到您的应用程序的配置文件,或者因为在客户端元素中找不到与此名称匹配的端点元素。“

这就是我在ATP的App.config文件中所拥有的。

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IWCFService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01: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">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://yashworkspace/BSS/WS/ServiceReference1.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWCFService"
            contract="ServiceReference1.IWCFService" name="BasicHttpBinding_IWCFService" />
    </client>
<services>
    <service name="ServiceReference1.WCFService">
        <endpoint address="http://yashworkspace/BSS/WS/ServiceReference1.svc" behaviorConfiguration="org.proj.WebServices.WCFServiceAspNetAjaxBehavior"
                binding="webHttpBinding" contract="org.proj.WebServices.IWCFService" />
    </service>
</services>
<behaviors>
    <endpointBehaviors>
        <behavior name="org.proj.WebServices.WCFServiceAspNetAjaxBehavior">
            <enableWebScript />
        </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
        <behavior name="">
            <serviceMetadata httpGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
    </serviceBehaviors>
</behaviors>
</system.serviceModel>

请让我知道可能出了什么问题? 我有一个正常的WCF服务,并且工作正常。

请帮忙。

问候 佳日

2 个答案:

答案 0 :(得分:1)

Drew Marsh的上述答案部分正确。但主要问题解决如下。 另外, 这里的问题是,当您将WCF公开为启用了ajax的WCF服务时,它使用JSON进行通信。当您从C#代码调用相同的服务时,它使用SOAP请求调用它。因此,您需要配置服务,使其接受JSON和SOAP请求。因此,在服务部分,您需要按如下方式配置

<services>
      <service name="ServiceReference1.WCFService">
          <endpoint address="" behaviorConfiguration="org.proj.WebServices.WCFServiceAspNetAjaxBehavior"
            binding="webHttpBinding" contract="org.proj.WebServices.IWCFService"  />
          <endpoint address="soapreq" behaviorConfiguration="org.proj.WebServices.MyServiceSOAPBehaviour" bindingConfiguration="BasicHttpBinding_IUpdateService"
                  binding="basicHttpBinding" contract="org.proj.WebServices.IWCFService" name="ServiceReference1.IWCFService" />
      </service>
  </services>

在behavior部分中,您需要按如下方式配置端点行为。

<endpointBehaviors>
          <behavior name="org.proj.WebServices.WCFServiceAspNetAjaxBehavior">
              <enableWebScript />
          </behavior>
          <behavior name="org.proj.WebServices.MyServiceSOAPBehaviour">
          </behavior>
      </endpointBehaviors>

答案 1 :(得分:0)

问题是端点的名称与客户端实例要查找的内容不匹配:

<endpoint address="http://yashworkspace/BSS/WS/ServiceReference1.svc" 
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWCFService" 
        contract="ServiceReference1.IWCFService" name="BasicHttpBinding_IWCFService" /> 

根据错误消息,它希望名称也是"ServiceReference1.IWCFService",因此您需要此端点。

<endpoint address="http://yashworkspace/BSS/WS/ServiceReference1.svc" 
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWCFService" 
        contract="ServiceReference1.IWCFService" name="ServiceReference1.IWCFService" />