向移动客户端公开WCF服务

时间:2010-09-26 14:30:28

标签: silverlight wcf

我有一个现有的ASP.NET Web应用程序。此ASP.NET Web应用程序使用JQuery为用户提供丰富的体验。此用户界面通过某些WCF服务与服务器交互。示例服务如下所示:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(IncludeExceptionDetailInFaults = false)]
public class myService : ImyService
{
  public bool SomeMethod(string parameter1, string parameter2)
  {
    try
    {
      return true;
    }
    catch (Exception ex)
    {
      return false;
    }
  }
}

我现在想要将此服务公开给iPhone和Windows Phone 7应用程序。为了做到这一点,我已经按照以下方式配置了服务:

<system.serviceModel>      
  <behaviors>
    <endpointBehaviors>
      <behavior name="myServiceBehavior">
        <enableWebScript />
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
      <behavior name="">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="false" />
      </behavior>
    </serviceBehaviors>
  </behaviors>

  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  <services>
    <service name="myService">
      <endpoint address="" behaviorConfiguration="myServiceBehavior"
        binding="webHttpBinding" contract="ImyService" />
    </service>
  </services>
</system.serviceModel>

该服务与我的ASP.NET Web应用程序中的JQuery调用一起使用。我还没有开始在iPhone客户端上工作。但是,当我尝试将此服务公开给我的WP7客户端时,我遇到了问题。就目前而言,当我启动WP7应用程序时,我收到一条错误消息:

KeyNotFoundException

如果我将配置文件中的绑定更改为“basicHttpBinding”,则无法在Visual Studio中引用该服务。我收到一条错误消息:

The endpoint at 'http://machine:80/services/myService.svc' does not have a Binding with the None MessageVersion.  'System.ServiceModel.Description.WebScriptEnablingBehavior' is only intended for use with WebHttpBinding or similar bindings.

唉。我该如何前进?我认为WCF旨在使这些东西更容易。但我觉得我在做一些相对基本的事情时会陷入困境。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

据我所知(但我对iPhone或WinPhone开发没有任何经验)你应该能够使用常规webHttpBinding公开你的WCF服务而没有网页脚本功能来获得正常的REST样式WCF服务:

<system.serviceModel>      
   <services>
      <service name="myService">
         <endpoint 
             address="" 
             binding="webHttpBinding" 
             contract="ImyService" />
      </service>
   </services>
</system.serviceModel>

仅此一项就足够了 - 只需浏览到* .svc文件所在的虚拟目录,就可以在浏览器中看到您的顶级资源。

移动设备通常不支持SOAP样式绑定(如basicHttpBinding等) - 因此您需要使用webHttpBinding代替(因为这实际上只需要HTTP客户端堆栈)设备 - 现在每台设备都有这个!)