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

3
我创建了一个“启用Ajax的WCF服务”。我可以从javascript代码中使用该服务,WebService的工作正常。但是,我想在它周围编写ATP。因此,我将webservice作为“服务引用”添加到我的ATP项目中。然后我像往常一样使用调用webservice。所有内容都可以编译。但是当我运行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服务,它完全正常运行。

请帮忙。

谢谢。 Yash

2个回答

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>

在行为部分,您需要按照以下方式配置您的端点行为。
<endpointBehaviors>
          <behavior name="org.proj.WebServices.WCFServiceAspNetAjaxBehavior">
              <enableWebScript />
          </behavior>
          <behavior name="org.proj.WebServices.MyServiceSOAPBehaviour">
          </behavior>
      </endpointBehaviors>

实际上,您并不必使用C#来使用SOAP进行通信。 您也可以将客户端绑定更改为使用webHttpBinding,这将导致它使用JSON以相同的方式进行通信。 - Drew Marsh

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" /> 

你的答案部分正确。谢谢。至少它向我展示了一种调试的方法。 - YCN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接