您的位置:首页 > 其它

WCF4.0 –- RESTful WCF Services (3) (Raw Stream)

2013-07-19 17:20 369 查看
前面2篇blog,主要在介绍REST WCF如何通过json/xml 和客户端完成交互。 这篇文章将对REST WCF的原生(RAW)流传输进行一次实例分析。

OK,还是利用 WCF REST Service Application 的工程模板,创建我们的REST WCF工程。



因为WCF REST服务不需要公开metadata, 所以 OperationContract 的定义也省略了。直接定义[ServiceContract]

如果修改模板中Service名,Global.asax中的RegisterRoutes方法也必须相应的修改。

下面是服务的实现:

[c-sharp]
view plaincopyprint?

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, Namespace="")]

public class ImageService

{
[WebGet(UriTemplate = "{image}")]

public Stream GetImage(string image)

{
var imageType = Path.GetExtension(image).TrimStart('.');

WebOperationContext.Current.OutgoingResponse.ContentType =
"image/" + imageType;
var dir = System.Web.HttpContext.Current.Server.MapPath("~/Images");

var file = Path.Combine(dir, image);
return File.OpenRead(file);

}

[WebInvoke(UriTemplate = "Add/{image}", Method="POST")]

public void AddImage(Stream stream,
string image)
{
var dir = System.Web.HttpContext.Current.Server.MapPath("~/Images");

var file = Path.Combine(dir, image);
var bitmap = Bitmap.FromStream(stream);
bitmap.Save(file);
}

[WebGet(UriTemplate = "ListAll", ResponseFormat=WebMessageFormat.Xml)]

public string[] GetAllImageNames()

{
var dir = System.Web.HttpContext.Current.Server.MapPath("~/Images");

var files = Directory.GetFiles(dir);
var images = new List<string>();

foreach (var file
in files)
{
var ext = Path.GetExtension(file);
if (ext == ".jpg" || ext ==
".gif")
images.Add(file);
}
for (int i = 0; i < images.Count; i++)

images[i] = Path.GetFileName(images[i]);
return images.ToArray();

}
}

[c-sharp]
view plaincopyprint?

public partial class MainWindow : Window

{
public MainWindow()

{
InitializeComponent();
}

private void Window_Loaded(object sender, RoutedEventArgs e)

{
op.RestoreDirectory = true;

op.Filter = "Jpeg Files(*.jpg)|*.jpg|Gif Files(*.gif)|*.gif";

BindData();
}

private void BindData()

{
var url = "http://localhost:3577/ImageService/ListAll";

var client = new HttpClient();

var stream = client.Get(url).Content.ReadAsStream();
var dataSer = new DataContractSerializer(typeof(string[]));

var obj = (string[])dataSer.ReadObject(stream);

this.listBox1.DataContext = obj;

}

private Microsoft.Win32.OpenFileDialog op =
new Microsoft.Win32.OpenFileDialog();

private void button1_Click(object sender, RoutedEventArgs e)

{
var ret = op.ShowDialog();
if (!ret.HasValue || !ret.Value || !op.CheckFileExists)
return;
var file = op.FileName;
var name = System.IO.Path.GetFileName(file);

var url = "http://localhost:3577/ImageService/Add/" + name;

var client = new HttpClient();

var content = HttpContent.Create(File.OpenRead(file));

var resp = client.Post(url, content);
resp.EnsureStatusIsSuccessful();

BindData();
}

private void button2_Click(object sender, RoutedEventArgs e)

{
this.Close();

}
}

[ValueConversion(typeof(string),
typeof(string))]

public class UriConverter : IValueConverter

{
public object Convert(object value, Type targetType,

object parameter, System.Globalization.CultureInfo culture)

{
if (value ==
null) return
null;
string sourceValue = value.ToString();

return "http://localhost:3577/ImageService/" + sourceValue;

}

public object ConvertBack(object value, Type targetType,

object parameter, System.Globalization.CultureInfo culture)

{
return value;

}
}

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
op.RestoreDirectory = true;
op.Filter = "Jpeg Files(*.jpg)|*.jpg|Gif Files(*.gif)|*.gif";

BindData();
}

private void BindData()
{
var url = "http://localhost:3577/ImageService/ListAll";
var client = new HttpClient();
var stream = client.Get(url).Content.ReadAsStream();
var dataSer = new DataContractSerializer(typeof(string[]));
var obj = (string[])dataSer.ReadObject(stream);
this.listBox1.DataContext = obj;
}

private Microsoft.Win32.OpenFileDialog op = new Microsoft.Win32.OpenFileDialog();

private void button1_Click(object sender, RoutedEventArgs e)
{
var ret = op.ShowDialog();
if (!ret.HasValue || !ret.Value || !op.CheckFileExists) return;
var file = op.FileName;
var name = System.IO.Path.GetFileName(file);
var url = "http://localhost:3577/ImageService/Add/" + name;
var client = new HttpClient();
var content = HttpContent.Create(File.OpenRead(file));
var resp = client.Post(url, content);
resp.EnsureStatusIsSuccessful();

BindData();
}

private void button2_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
}

[ValueConversion(typeof(string), typeof(string))]
public class UriConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
if (value == null) return null;
string sourceValue = value.ToString();
return "http://localhost:3577/ImageService/" + sourceValue;
}

public object ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
}


实现的注意点:

1) 获得所有图片名,服务端返回的是string[]的序列化的xml,用DataContractSerializer反序列化。

var dataSer = new DataContractSerializer(typeof(string[]));

2) WPF中的OpenFileDialog在Microsoft.Win32命名空间下。(必须引用WindowsBase.dll)

3) 利用 Microsoft.Http.HttpClient 上传图片, 实例化 HttpContent, 通过client.Post上传

var url = "http://localhost:3577/ImageService/Add/" + name;

var client = new HttpClient();

var content = HttpContent.Create(File.OpenRead(file));

var resp = client.Post(url, content);

resp.EnsureStatusIsSuccessful();

4) 定义了一个Converter, 将 ListBox 绑定到 Image 控件的 Source

Source="{Binding ElementName=listBox1, Path=SelectedItem,
Converter={StaticResource uriConv}}"

源代码下载:REST WCF Raw Stream 示例代码

【REST WCF系列】

RESTful WCF Services (1) (入门)

RESTful WCF Services (2) (实现增,删,改,查)

RESTful WCF Services (3) (Raw Stream)

RESTful WCF Services (4) (Basic Security)

RESTful WCF Services (实例) (并发同步服务 SyncService)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: