• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

使用mongodb,asp.netmvc4webapi,win8,metro做的简单相册

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

win8消费者预览版,vs11,mongodb,metro,win2003,java

考虑:考察了很多nosql数据库, 也深入研究了cassandra机制,并尝试编写程序操作了一番。后来在win8 metro群里受教了,在此也非常感谢“无疆乄炎戎”群主的帮助。后改为考虑mongodb,逻辑层选择开发简单快速的框架,所以选择了asp.net mvc,因安装了vs11,所以用了mvc 4。mvc web api主要以rest形式服务,故选择了开源的rest客户端,目前使用RestSharp。

下载:http://www.mongodb.org/downloads

选择2.0.4,windows 32位,没有选择Unstable版本。

下载后解压,需要新建data目录,以及data目录下的db目录。

因为32位的系统,mongodb最大支持数据库大小为2G,所以官方推荐64位系统。

以上工作做完后,在命令行里运行
>mongod --dbpath e:\mongodb-2.0.4\data即可

在浏览器里http://localhost:27017/

会显示

You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number

至此,安装完毕。

简单配置

# 除了启动时接受命令行参数,MongoDB也可以配置使用一个配置文件,可以以指定使用 -f 或 --config 命令行选项。
mongod -f d:\mongodb-2.0.4\mongodb.conf

# 配置文件范例
# This is an example config file for MongoDB.
dbpath = d:\mongodb-2.0.4\data # 指定数据库路径
logpath = d:\mongodb-2.0.4\mongodb.log # 日志路径
logappend = true # 以追加的方式写日志

port = 27277 # 指定端口号,默认27017
auth = true # 增加验证选项

安全

  目前mongodb的安全机制很一般,仅仅在用户权限方面做了些工作(也许我孤陋寡闻,希望不吝赐教)。可以创建只读用户和读取的权限。
  默认,mongodb启动是没有授权验证的,需要配置,可以在启动的时候在命令中添加–auth参数。也可以将-auth加入配置文件。mongodb的授权验证是在数据库连接以后。用户权限有两种,一种是数据库管理用户,一种是个体数据库私有用户。

  据我看到一位首次接触mongodb的学习过程中,尝试扫描一部分计算机的mongodb的默认连接端口,发现只有很少一部分加了验证。

2、asp.net mvc 4 web api

   因为做了小白鼠,所以安装了win8和vs11。看着别人的示例,简单做了个流程,发现比spring的简单多了,基本不需要怎么配置。主要集中学习 rest式数据服务。c#操作mongodb,使用官方的客户端api。下载地址:https://github.com/mongodb/mongo- csharp-driver/downloads。不需要源码的,可以直接下载MongoDB.Bson.dll和 MongoDB.Driver.dll。接着引用到mvc工程中。

  数据库连接字符串:mongodb://fred:foobar@localhost/baz    fred:foobar是用户名和密码,baz相当于你建立的数据库,即使没有这个库,在连接的时候会自动建好。

  创建:

var db = MongoDatabase.Create(ConfigurationManager.ConnectionStrings["MongoDB_feni"].ConnectionString);

  插入数据:

db["testTable"].Insert(new MongoDB.Bson.BsonDocument { 
{ "PhotoID", photo.PhotoID },
{ "Name", photo.Name },
{ "Description", photo.Description },
{ "Data", photo.Data },
{ "DateTime", photo.DateTime } });

  删除数据:

var query = Query.EQ("PhotoID", photo.PhotoID);
db["testTable"].Remove(query);

  查找所有数据:

db["testTable"].FindAll();

  web api的相对简单,只需要在里面写点逻辑即可。运行后默认url/api/action....,可以直接在浏览器上测试一下。

3、Rest Client

  客户端api选择restSharp,导入dll文件后,即可进行数据服务连接,目前没有考虑安全方面,因其考虑较多,以实现功能为主。

  客户端代码从国外一个开源项目中剥离出来。

  连接url

<add key="ServiceUrl" value="http://localhost:50182/api/photos"/>
//获取所有记录
string
url = ConfigurationManager.AppSettings["serviceUrl"];
string requestUrl = string.Format("{0}", url);
RestClient client = new RestClient();
client.BaseUrl = requestUrl;
client.ExecuteAsync<List<PhotoItem>>(new RestRequest(),
(response) =>
{
foreach (var photo in response.Data)
photo.UploadedOn = new DateTime(photo.UploadedOn.Ticks, DateTimeKind.Utc).ToLocalTime();
listPhotoItem = response.Data;
});
dgPhotos.ItemsSource = listPhotoItem;


4、测试rest 客户端

  使用restclient-ui-2.3.3-jar.jar,需要java环境。直接运行即可。

sln下载

https://files.cnblogs.com/feni/Projects.part1.rar

https://files.cnblogs.com/feni/Projects.part2.rar

以上是当时仅仅为了走通流程简单写的。

这几天经过一点加工,如下

1:wei api中对插入图片文件的操作mongodb的代码修改一下,使用mongodb里的GridFs保存文件。

2:简单加了一个验证,但因为后来做win8 metro的客户端时候,因为没有内置的md5和sha之类的,所以暂时屏蔽验证代码。

3:web api,post上来的数据:

 IEnumerable<HttpContent> parts = await Request.Content.ReadAsMultipartAsync();
            foreach (var content in parts)
            {
                if (content.Headers.ContentDisposition.Name == "\"fileContents\"")
                {
                    //如果使用content.ReadAsByteArrayAsync,则会引起超出配置的最大buffer异常

如果使用 content.ReadAsByteArrayAsync()来读取,会发生Cannot write more bytes to the buffer than the configured maximum buffer size: 65536

这个异常。故用content.ReadAsStreamAsync()来代替。

4:这次增加了win8 metro样式的客户端,效果图如下:

5:metro 读取图片代码:

async private void ImageOpenButon_Click(object sender, RoutedEventArgs e)
        {
            if (EnsureUnsnapped())
            {
                FileOpenPicker openPicker = new FileOpenPicker();
                openPicker.ViewMode = PickerViewMode.Thumbnail;
                openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
                openPicker.FileTypeFilter.Add(".jpg");
                openPicker.FileTypeFilter.Add(".jpeg");
                openPicker.FileTypeFilter.Add(".png");
                ImageUploadButon.IsEnabled = false;
                SelectedProgressRing.IsActive = true;
                StorageFile file = await openPicker.PickSingleFileAsync();
                
                if (null != file)
                {
                    userTxt.Text = file.Name;

                    using (Stream stream = await file.OpenStreamForReadAsync())
                    {
                        byte[] buf = new byte[65536];
                        int nReaded = 0;
                        var tmpMs = new MemoryStream();
                        while ((nReaded = await stream.ReadAsync(buf, 0, buf.Length)) > 0)
                        {
                            tmpMs.Write(buf, 0, nReaded);
                        }
                        fileData = tmpMs.ToArray();
                    }
                    ImageUploadButon.IsEnabled = true;
                    SelectedProgressRing.IsActive = false;
                }
                else
                {
                    userTxt.Text = "没有选择要上传的文件";
                }
            } 
        }

6:metro 上传图片的代码:

 async private void ImageUploadButon_Click(object sender, RoutedEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(userTxt.Text))
            {
                MessageDialog md = new MessageDialog("请选择一个要上传的图片文件", "没有选择任何图片");
                await md.ShowAsync();
                userTxt.Focus(Windows.UI.Xaml.FocusState.Pointer);
            }
            else if (string.IsNullOrWhiteSpace(ImageDescription.Text))
            {
                MessageDialog md = new MessageDialog("请填写图片的描述", "图片描述为空");
                await md.ShowAsync();
                ImageDescription.Focus(Windows.UI.Xaml.FocusState.Pointer);
            }
            else
            {
                try
                {
                    ImageUploadButon.IsEnabled = false;
                    UploadProgressRing.IsActive = true;

                    string url = PhotoItem.SERVICEURL;
                    string requestUrl = string.Format("{0}/", url);
                    RestClient client = new RestClient();
                    client.BaseUrl = requestUrl;

                    ////加密密码,以验证用户
                    //HashEncrypt he = new HashEncrypt(true, false);
                    //string hePwd = he.SHA256Encrypt("feni");
                    //client.Authenticator = new HttpBasicAuthenticator("aaron", hePwd);

                    RestRequest restRequest = new RestRequest();
                    restRequest.Method = Method.POST;
                    restRequest.AddHeader("fileName", userTxt.Text);
                    restRequest.AddHeader("description", ImageDescription.Text);
                    restRequest.RequestFormat = RestSharp.DataFormat.Json;
                    restRequest.AddFile("fileContents", fileData, userTxt.Text);
                    RestResponse restResponse = client.Execute(restRequest);

                    ImageUploadButon.IsEnabled = true;
                    UploadProgressRing.IsActive = false;
                    if (restResponse.Content == "\"OK\"")
                    {
                        MessageDialog md = new MessageDialog(userTxt.Text + "\r\n图片保存成功", "上传结果");
                        await md.ShowAsync();

                        var sampleData = new PhotosDataSource();
                        var rootFrame = new Frame();
                        rootFrame.Navigate(typeof(GroupedItemsPage), sampleData.ItemGroups);

                        Window.Current.Content = rootFrame;
                        Window.Current.Activate();
                    }
                    else
                    {
                        MessageDialog md = new MessageDialog(userTxt.Text + "\r\n图片保存未成功,请重试", "上传结果");
                        await md.ShowAsync();
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
        }


代码稍后上传


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NET开发,简化与封装发布时间:2022-07-10
下一篇:
ASP.NETLog4net记录日志发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap