×
Namespaces

Variants
Actions
Revision as of 14:27, 27 June 2013 by hamishwillee (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Windows Phone和Rest服务交互

From Nokia Developer Wiki
Jump to: navigation, search
WP Metro Icon Web.png
SignpostIcon XAML 40.png
SignpostIcon WP7 70px.png
Article Metadata

代码示例
兼容于
文章
WS - OtomiiLu 在 19 Sep 2012 创建
最后由 hamishwillee 在 27 Jun 2013 编辑

对于手机来讲,什么事最重要的?毫无疑问,是数据传输的内容大小和数据传输的速度,但是,当我们进行数据的传输的时候,即使是最基本的传输,也会有加密解密的问题(Base64),同时,也会附上一些我们并不需要的Soap Headers。当我们进行大规模的交互的交互的时候,这种多余的数据可能为我们造成双倍的数据传输量,这并不是我们希望看到的,这时候,有一种新的技术为我们的网络传输提供了非常直白直接的文本传输方式,即Rest Service,在Rest Service交互中,我们除了有用的文本,我们不需要其他任何的内容。

Contents

定义Wcf Rest Service

在WCF中,提供了一种专门为Rest Service提供的一种Binding类型:WebHttpBinding。 首先,让我们来定义我们的Service: IService1:

    [ServiceContract]
public interface IService1
{
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
string GetData();
}

Service1.svc:

    public class Service1 : IService1
{
public string GetData()
{
return string.Format("You entered nothing");
}
}

通过代码,我们发现在IService1中我们提供了WebGet的属性,这个属性是标识这个方法可以通过Get请求来,同时还有一个叫做WebInvoke的属性,提供的是Post请求服务。 然后,我们可以设置ResponseFormat,这里我们设置我们的ResponseFormat为Json,因为设置为Json,那么到时候,数据会直接返回给Client端简简单单的You entered nothing,而不会有其他的东西,而我们还可以设置ResponseFormat为XML,那么返回的就是一个完整的XML:

<?xml version="1.0"?>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">You entered nothing</string>

接着,我们则需要在web.config中定义这种Binding:

    <services>
<service name="WcfAuthService.Service1" >
<endpoint address="" behaviorConfiguration="RestBehavior" binding="webHttpBinding"
name="RestEndpoint" contract="WcfAuthService.IService1" />
</service>
</services>

通过以上代码,我们就定义了我们的Binding了,设置了binding和contract,因为我们会把我们的Service部署到IIS中,所以address设置为空。 注意,我们还定义了behaviorConfiguration,这是一个必须定义的元素,因为我们需要给予我们的Binding一种名为webHttp的行为:

      <endpointBehaviors>
<behavior name="RestBehavior">
<webHttp />
</behavior>
</endpointBehaviors>

通过这种行为我们才可以以http的形式进行访问。

全部的web.config代码:

<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
</system.web>
<system.serviceModel>
<bindings>
</bindings>
<services>
<service name="WcfAuthService.Service1" >
<endpoint address="" behaviorConfiguration="RestBehavior" binding="webHttpBinding"
name="RestEndpoint" contract="WcfAuthService.IService1" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="RestBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>

部署到IIS

因为是Http访问,所以我们就需要部署到IIS上,Visual Studio给我们提供了一种比较快捷的Publish的方式。具体步骤如下所示: 首先右键你的项目,然后点击Publish,然后会跳出一个Publish Web Application,点击New,新增一个配置文件:


WPTOIIS1.JPG 输入这个配置文件的名称:

WPTOIIS2.JPG

然后在第二栏里选择我们的Publish method为File System:

WPTOIIS3.JPG

然后只有两条条目,在第一条条目的后面点击…按钮,并显示Target Location框。 创建一个名为WCFTest的文件夹,然后点击Open:

WPTOIIS4.JPG

最后,选择是否以那种方式发布,有Release和Debug两种:

WPTOIIS5.JPG

如果选择Debug,那么我们就可以在部署后,仍旧可以调试我们的WCF程序。 点击Debug=>Attach to Process:

WPTOIIS6.JPG

勾选Show processes from all users,然后选择w3wp.exe即可,这个程序就是我们需要的调试的IIS APPPOOL程序,最后点击Attach即可:

WPTOIIS7.JPG

当然,因为我提供的实例程序非常的简单,所以我们现在只选择Release发布即可。 然后,打开Browser,键入http://localhost/WCFTest/Service1.svc/GetData 我们就可以获得我们需要的内容,如下所示:

WPTOIIS8.JPG

这样,我们的部署就完成了。

Windows Phone端的访问

首先,我们在界面上创建我们的程序:

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="10,10,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click" />
<TextBlock Height="30" HorizontalAlignment="Left" Margin="12,88,0,0" Name="textBlock1" Text="TextBlock" VerticalAlignment="Top" />
</Grid>

截图:

WPRestTest1.JPG

后台代码:

        private void button1_Click(object sender, RoutedEventArgs e)
{
HttpRequest();
}
private void HttpRequest()
{
string str = string.Empty;
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(@"http://172.18.28.161:80/WCFTest/Service1.svc/getdata");
var result = (IAsyncResult)req.BeginGetResponse(ResponseCallback, req);
}
private void ResponseCallback(IAsyncResult result)
{
var request = (HttpWebRequest)result.AsyncState;
var response = request.EndGetResponse(result);
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
var contents = reader.ReadToEnd();
Dispatcher.BeginInvoke(() => { textBlock1.Text = contents; });
}
}

运行后的截图:

WPRestTest2.JPG

总结

这样,简单的WCF Sevice就完成了,是不是非常的简单。希望可以帮到大家。 项目代码:

File:WcfAuthService.zip

File:RestPhone.zip

This page was last modified on 27 June 2013, at 14:27.
124 page views in the last 30 days.