在 Android 中通过 SSL 使用 WCF 服务
Posted
技术标签:
【中文标题】在 Android 中通过 SSL 使用 WCF 服务【英文标题】:Consume WCF Service over SSL in Android 【发布时间】:2016-07-19 13:14:06 【问题描述】:我一直在使用WCF
(.svc) 服务一段时间,其请求格式为JSON
,响应格式为XML
在运行正常的android 应用程序中。几天前,我在 DigiCert 的 WCF
服务上实现了一个用于 SSL
目的的证书(使用我的通配符功能)。该服务可从浏览器访问,并且没有显示错误。下面是 WebConfig
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="IntermediateWebService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<customErrors mode="Off"/>
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="IntermediateWebService.WebBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpsGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="WebBehavior">
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="secureHttpBinding" maxBufferPoolSize="524288" maxReceivedMessageSize="999999999">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</basicHttpBinding>
<webHttpBinding>
<binding name="webHttpBindingConfig">
<readerQuotas maxStringContentLength="2048000" />
</binding>
</webHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="IntermediateWebService.WebBehavior" name="IntermediateWebService.Service1">
<host>
<baseAddresses>
<add baseAddress="https://myurl:4445/"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="IntermediateWebService.IService1" behaviorConfiguration="WebBehavior" bindingConfiguration="secureHttpBinding" />
</service>
<!--<service name="IntermediateWebService.Service1">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="secureHttpBinding"
contract="IntermediateWebService.IService1"/>
</service>-->
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="false" />
</system.serviceModel>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
所以现在在使用相同的 Android 代码时,响应总是
The server cannot service the request because the media type is unsupported.
我尝试过使用 SSL Factory,但也没有使用它。
HttpClient client = getHttpsClient(new DefaultHttpClient()); //new DefaultHttpClient();
HttpPost get = null;
commandType = params[0].toString();
if ("Login".equals(params[0]))
JSONStringer img = new JSONStringer()
.object()
.key("value")
.object()
.key("username").value(params[1].toString())
.key("pwd").value(params[2].toString())
.key("channelID").value(params[3].toString())
.endObject()
.endObject();
StringEntity se = new StringEntity(img.toString());
get = new HttpPost("https://" + serverIP + ":" + serverPort + "/Service1.svc/auth");
//get.setHeader("User-Agent", "com.app.new");
get.setHeader("Accept", "application/json");
get.setHeader("Content-Type", "application/json");
get.setEntity(se);
【问题讨论】:
在***.com/questions/32154115/… 或***.com/questions/32051482/… 或***.com/questions/32969952/… 尝试我的一些答案,看看他们是否可以提供帮助 目标android平台是否支持tls版本? 试试这个答案。 ***.com/questions/36492885/… 尝试将此标头用于请求“Content-Type”、“text/xml; charset=utf-8” 您是否尝试过从浏览器以外的其他设备发出请求并看到它正常工作?例如,如果您使用的是 Google Chrome,请尝试名为“Postman RestClient”和“Advanced RestClient”的插件。查看它是否与您在 Java 代码中设置的标题和POST
正文一起使用。我要解决的问题是,弄清楚这是否是 Android/Java 的问题。如果它仍然有效,请尝试用 OkHttp
替换您的 HTTP 客户端,看看是否有区别。您也可以向我们公开您的服务,如果您愿意,我们可以“试驾”它;-)
【参考方案1】:
当我探索返回状态码为 415 的错误时,WCF
服务不接受该请求作为有效的JSON
,因此通过在 svc 标记中添加以下属性就可以了
Factory="System.ServiceModel.Activation.WebServiceHostFactory"
这是完整的标记
<%@ ServiceHost Language="C#" Debug="true" Service="IntermediateWebService.Service1" CodeBehind="Service1.svc.cs"
Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
【讨论】:
以上是关于在 Android 中通过 SSL 使用 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章
在 Service Fabric 中通过 HTTPS 调用 WCF:请求被中止:无法创建 SSL/TLS 安全通道
在 WCF REST 服务中通过 POST 发送参数的正确 URI 是啥?
如何在 Express 应用程序中通过 SSL 获取 websocket?
如何在 ruby 中通过 SSL 调用 HTTP POST 方法?