WebApi用JilFormatter处理客户端序列化的字符串加密,之后在服务端解析。

本文有改动,参考原文:https://www.cnblogs.com/liek/p/4888201.html

https://www.cnblogs.com/tonykan/p/3963875.html

功能背景:WebApi 客户端 一个Model 序列化为string类型,想将其加密之后再Post到服务端,在服务端解析出来再处理。

Jil.dll 安装:

然后: 选择项目,输入 Install-Package Jil 回车。

然后创建一个JilFormatter类,代码如下:

using Jil;
using OLW.Common.Helpers;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Xml.Serialization;

namespace WxPayWebApi.Common
{
    public class JilFormatter : MediaTypeFormatter
    {
        private readonly Options _jilOptions;
        private MethodInfo _method;

        public JilFormatter()
        {
            //要序列化的时间格式
            _jilOptions = new Options(dateFormat: DateTimeFormat.ISO8601);
            //媒体类型
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/test"));
            //加入 UTF8Encoding 编码
            SupportedEncodings.Add(new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true));
            //加入 UnicodeEncoding 编码
            SupportedEncodings.Add(new UnicodeEncoding(bigEndian: false, byteOrderMark: true, throwOnInvalidBytes: true));

        }
        //判断是否反序列化类型
        public override bool CanReadType(Type type)
        {
            if (type == null)
            {
                throw new ArgumentNullException("type");
            }
            return true;
        }
        //判断是否序列化类型
        public override bool CanWriteType(Type type)
        {
            if (type == null)
            {
                throw new ArgumentNullException("type");
            }
            return true;
        }

        //  异步反序列化一个指定类型的对象。
        public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, System.Net.Http.HttpContent content, IFormatterLogger formatterLogger)
        {
            return Task.FromResult(DeserializeFromStream(type, readStream));
        }

        private object DeserializeFromStream(Type type, Stream readStream)
        {
            try
            {
                StreamReader sr = new StreamReader(readStream);
                string text = sr.ReadToEnd();
                string s = EncrypAndDecrypHelper.Decrypt(text);

                using (StringReader ssr = new StringReader(s))
                {
                    XmlSerializer xmldes = new XmlSerializer(type);
                    return xmldes.Deserialize(ssr);
                }

                //using (var reader = new StreamReader(readStream))
                //{
                    //return JSON.Deserialize(reader, type, _jilOptions);
                //}
            }
            catch
            {
                return null;
            }
        }

        //  异步序列化一个指定类型的对象。
        public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, System.Net.Http.HttpContent content, TransportContext transportContext)
        {
            var streamWriter = new StreamWriter(writeStream);
            JSON.Serialize(value, streamWriter, _jilOptions);
            streamWriter.Flush();
            return Task.FromResult(writeStream);
        }
    }
}

在这里获取到 客户端传来的字符串 解密处理:

       private object DeserializeFromStream(Type type, Stream readStream)        {            try            {                StreamReader sr = new StreamReader(readStream);                string text = sr.ReadToEnd();                string s = EncrypAndDecrypHelper.Decrypt(text);

                using (StringReader ssr = new StringReader(s))                {                    XmlSerializer xmldes = new XmlSerializer(type);                    return xmldes.Deserialize(ssr);                }            }            catch            {                return null;            }        }

WebApi配置加: GlobalConfiguration.Configuration.Formatters[0] = new JilFormatter();

   public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服务
            // 将 Web API 配置为仅使用不记名令牌身份验证。
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            //GlobalConfiguration.Configuration.Formatters;
            //config.Formatters.Clear();
            //config.Formatters.Add(new CustomNamespaceXmlFormatter());

            var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
            Console.WriteLine(json);
            json.UseDataContractJsonSerializer = true;

            var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
            xml.UseXmlSerializer = true;

            GlobalConfiguration.Configuration.Formatters[0] = new JilFormatter();

            // Web API 路由
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

        }
    }
时间: 2024-10-15 16:51:28

WebApi用JilFormatter处理客户端序列化的字符串加密,之后在服务端解析。的相关文章

关于NFS客户端挂载成功但不显示NFS服务端挂载目录下的文件的处理办法及问题还原。

一.问题原因 1.1NFS客户端某个目录虽然挂载成功NFS服务端的目录,但是NFS客户端挂载目录里并不显示NFS服务端目录下的内容. 1.2NFS客户端某个目录虽然卸载成功NFS服务端的目录,但是NFS客户端挂载目录里依然显示NFS服务端目录下的内容. 二.问题结论 在NFS客户端挂载/卸载NFS服务端目录的时候一定要事先退出挂载目录!挂载/卸载目录之后,再进入挂载目录查看结果! 三.问题展现 3.1测试服务器基本配置 #提供一台NFS客户端,一台NFS服务端.下述不提供NFS安装教程. #两台

一次http请求,谁会先断开TCP连接?什么情况下客户端先断,什么情况下服务端先断?

我们有2台内部http服务(nginx): 201:这台服务器部署的服务是account.api.91160.com,这个服务是供前端页面调用: 202:这台服务器部署的服务是hdbs.api.91160.com,    这个服务是供前端页面调用: 近期发现,这2台服务器的网络连接中,TIME_WAIT 数量差别很大,201的TIME_WAIT大概20000+,202的TIME_WAIT大概1000 ,差距20倍:2台的请求量差不多,都是以上内部调用的连接,且服务模式也没有什么差异,为什么连接数

android客户端利用sokcet通信和向Java服务端发请求,Java服务端把文件发给android客户端

Java服务端 package com.yqq.socketTest; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;

客户端如何更具需要连接不同的服务端

当我们写客户端<-------->服务端的时候,AB服务端都可以做同样的工作,通过右键添加服务引用的话,拂过做成分布集群的话,一两个服务端无所谓,十个了你得添加十次,二十个你得添加二十次.那么问题出现了,如何在客户端动态的根据各个服务器连接数自动的负载均衡了. 第一步:服务端肯定有服务文件,如图 代码如下: using System; using System.Collections.Generic; using System.IO; using System.Linq; using Syst

使用socket实现简单的客户端和服务端通信(C#语言)

1.主要思路: (1) 服务端开启监听线程,等待客户端的连接. 每个socket连接放到独立线程中处理. (2) 服务端和客户端使用约定的消息格式通信.对于比较复杂的消息(如向服务端传递一个实例),可以使用json封装传输. (3) 每个连接的客户端,注册唯一的ClientID,在服务端以此来区分消息的来源. 2.代码构成 实现该样例包含两个cs的客户端程序. 分别为 服务端 和 客户端. 3.主要代码: (1) 服务端 xaml <Window x:Class="WpfApplicati

C# Socket服务端与客户端通信(包含大文件的断点传输)

步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收信息   (3)发送数据(这里分发送字符串.文件(包含大文件).震动) 二.客户端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收信息   (3)发送数据(这里分发送

[C语言]一个很实用的服务端和客户端进行TCP通信的实例

本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件client.c,内容如下: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <

Unity使用C#实现简单Scoket连接及服务端与客户端通讯

简介: 网络编程是个很有意思的事情,偶然翻出来很久之前刚开始看Socket的时候写的一个实例,贴出来吧 Unity中实现简单的Socket连接,c#中提供了丰富的API,直接上代码. 服务端代码: [csharp] view plain copyThread connectThread;//当前服务端监听子线程 public string address;//当前地址 public int port;//当前本地端口 TcpClient romoteClient;//远程客户端 // Use t

服务端渲染与客户端渲染

服务端渲染: 服务端内,直接通过模板引擎,将数据与模板结合,直接生成html文件,返回给客户端进行解析.客户端只负责解析html 动态的数据直接在后端与模板结合了,不需要前端进行请求获取,但是一些后期的交互,还是需要在客户端执行,像点击删除某一个商品信息 客户端渲染: 在客户端生成最终的html, 第一次请求:  请求页面输入网址,服务端返回html静态文件,浏览器在进行解析渲染 第二次请求:请求动态数据,页面的数据需要请求服务器获得,得到相应数据后,浏览器根据html文件的js,操作DOM,生