项目需要提供接口给.NET团队使用,为方便大伙,特地写一个从Java接口生成C#可用Model包的工具Class

主Class是一个Controller,可以随时进行生成

package com.fang.microservice.cloud.controller;

import com.alibaba.druid.sql.visitor.functions.Char;
import com.fang.microservice.cloud.domain.MS_ServiceActionInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.annotation.Annotation;
import java.lang.reflect.*;
import java.math.BigDecimal;
import java.net.URLConnection;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * Created by Administrator on 2017/5/11.
 */
@RestController
@ApiIgnore
public class CodeController {
    /**
     * 代码生成服务,创建C#访问代码
     *
     * @param request
     * @param platformCode
     * @param platformToken
     * @return
     */
    @RequestMapping(value = "/servicecodeforcsharp", method = {RequestMethod.GET, RequestMethod.POST})
    public void buildCodeFiles(HttpServletRequest request, HttpServletResponse response, String platformCode, String platformToken) throws IOException {
        //获取Web应用上下文
        WebApplicationContext wc = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());

        LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();

        //创建临时目录
        String tempDirectoryName = UUID.randomUUID().toString();
        File tempDirectory = new File(tempDirectoryName);
        tempDirectory.mkdir();
        //复制文件到临时目录
        createResFile(wc, "ActionHandler.cs", tempDirectoryName);
        createResFile(wc, "NetUtility.cs", tempDirectoryName);
        createResFile(wc, "Proxy.cs", tempDirectoryName);

        //获取所有的Controller实例
        Map<String, Object> controllerBeans = wc.getBeansWithAnnotation(RestController.class);
        //遍历Controller实例,创建访问文件
        for (String beanKey : controllerBeans.keySet()) {
            //Controller映射访问路径
            String controllerBasePath = "";
            Object beanVal = controllerBeans.get(beanKey);
            Class beanClass = beanVal.getClass();
            //判断是否是可对外的Controller
            Annotation apiAnnotation = beanClass.getAnnotation(Api.class);
            if (apiAnnotation == null) {
                continue;
            }
            //判断是否忽略
            Annotation apiIgnoreAnnotation = beanClass.getAnnotation(ApiIgnore.class);
            if (apiIgnoreAnnotation != null) {
                continue;
            }
            //获取Controller基础地址
            RequestMapping requestMappingAnnotation = (RequestMapping) beanClass.getAnnotation(RequestMapping.class);
            if (requestMappingAnnotation != null) {
                String[] vals = requestMappingAnnotation.value();
                if (vals != null && vals.length > 0) {
                    controllerBasePath = vals[0];
                }
            }
            //创建Controller目录
            createDirectory(tempDirectoryName + "/" + controllerBasePath);
            //获取输入模型顶级目录
            String actionInModelDir = tempDirectoryName + "/" + controllerBasePath + "/In";
            //创建Controller目录.输入模型In
            createDirectory(actionInModelDir);
            //创建输出模型顶级目录
            String actionOutModelDir = tempDirectoryName + "/" + controllerBasePath + "/Out";
            //创建Controller目录.输出模型Out
            createDirectory(actionOutModelDir);

            //获取所有对外服务方法
            Method[] allMethods = beanClass.getDeclaredMethods();
            for (Method method : allMethods) {
                //识别是否可对外方法
                if (!method.isAnnotationPresent(RequestMapping.class)) {
                    continue;
                }
                //获取方法路径映射
                RequestMapping methodMappingAnnotation = method.getAnnotation(RequestMapping.class);
                //方法映射的访问地址
                String methodRelUri = "";
                String[] methodMappingVals = methodMappingAnnotation.value();
                if (methodMappingVals != null && methodMappingVals.length > 0) {
                    methodRelUri = methodMappingVals[0];
                }
                //获取方法名称描述
                String methodDescription = "";
                ApiOperation methodApiOption = method.getAnnotation(ApiOperation.class);
                if (methodApiOption != null && methodApiOption.value() != null && !methodApiOption.value().equals("")) {
                    methodDescription = methodApiOption.value();
                }
                //方法的完整地址
                String methodActionUri = controllerBasePath + methodRelUri;
                //获取方法输入参数
                Parameter[] methodParameters = method.getParameters();
                //获取方法返回结果
                Class methodReturnClass = method.getReturnType();
                HashMap<String, String> params = new HashMap<>();
                String[] methodParameterNames = u.getParameterNames(method);
                int paramIndex = 0;
                for (Parameter param : methodParameters) {
                    params.put(methodParameterNames[paramIndex], getParameterTypeString(param, actionInModelDir));
                    paramIndex++;
                }
                //方法输出结果类型字符串
                String outputModelTypeString = methodReturnClass.getTypeName();
                buildModelCodeString(methodReturnClass, actionOutModelDir);

                appendServiceAction(methodActionUri, outputModelTypeString, params, methodDescription);
            }
        }
        buildService(tempDirectoryName);
        buildZipFile(tempDirectoryName, "CSharp.zip");
        tempDirectory.deleteOnExit();
        File downloadFile = new File("CSharp.zip");
        try {
            String mimeType = URLConnection.guessContentTypeFromName(downloadFile.getName());
            if (mimeType == null) {
                mimeType = "application/octet-stream";
            }
            response.setContentType(mimeType);
            String pathTmp = java.net.URLEncoder.encode("CSharp.zip", "UTF-8");
            response.setHeader("Content-Disposition", String.format("inline; filename=\"" + pathTmp + "\""));
            response.setContentLength((int) downloadFile.length());
            InputStream inputStream = new BufferedInputStream(new FileInputStream(downloadFile));
            FileCopyUtils.copy(inputStream, response.getOutputStream());
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } finally {
            downloadFile.delete();
            tempDirectory.delete();
        }
    }

    private void buildModelCodeString(Class modelClass, String directoryName) {
        if (modelTypeList.contains(modelClass.getName())) {
            return;
        }
        modelTypeList.add(modelClass.getName());
        StringBuilder txt = new StringBuilder();
        txt.append("using System;").append("\r\n");
        txt.append("using System.Collections.Generic;").append("\r\n");
        txt.append("\r\n");
        String modelClassName = modelClass.getName();
        txt.append("namespace ").append(modelClassName.replace("." + modelClass.getSimpleName(), "")).append("\r\n");
        txt.append("{\r\n");
        txt.append("\tpublic class ").append(modelClass.getSimpleName()).append("\r\n");
        txt.append("\t{\r\n");
        for (Field field : modelClass.getDeclaredFields()) {
            try {
                txt.append("\t\tpublic ").append(getFieldTypeString(field, directoryName)).append(" ").append(field.getName()).append(" { get; set; }\r\n");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        txt.append("\t}\r\n");
        txt.append("}");
        buildAndSaveFile(directoryName + "/" + modelClass.getSimpleName() + ".cs", txt.toString());
    }

    /**
     * 检测和创建文件夹
     *
     * @param directoryName
     */
    private void createDirectory(String directoryName) {
        File directory = new File(directoryName);
        if (!directory.exists()) {
            directory.mkdirs();
        }
    }

    /**
     * 从资源文件创建公共访问文件
     *
     * @param wc
     * @param fileName
     * @param tempDirectoryName
     */
    private void createResFile(WebApplicationContext wc, String fileName, String tempDirectoryName) {
        try {
            PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
            Resource[] resources = patternResolver.getResources("classpath*:csharp/" + fileName);
            if (resources != null && resources.length > 0) {
                InputStreamReader isr = new InputStreamReader(resources[0].getInputStream());
                File destActionHandlerFile = new File(tempDirectoryName + "/" + fileName);
                if (!destActionHandlerFile.exists()) {
                    destActionHandlerFile.createNewFile();
                }

                char[] fileBytes = new char[256];
                FileOutputStream fos = new FileOutputStream(destActionHandlerFile);
                OutputStreamWriter osw = new OutputStreamWriter(fos);
                int readCount = -1;
                do {
                    readCount = isr.read(fileBytes);
                    if (readCount > 0) {
                        osw.write(fileBytes, 0, readCount);
                    }
                } while (readCount > 0);
                osw.flush();
                osw.close();
                fos.flush();
                fos.close();
                isr.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 应用服务名称
     */
    @Value("${spring.application.name}")
    private String applicationName;

    /**
     * 获取应用服务短名称
     *
     * @return
     */
    private String getServiceName() {
        if (!applicationName.contains("-")) {
            return applicationName;
        }
        return applicationName.substring(applicationName.lastIndexOf('-') + 1);
    }

    /**
     * 创建和保存文件
     *
     * @param fileName
     * @param content
     */
    private void buildAndSaveFile(String fileName, String content) {
        File targetFile = new File(fileName);
        if (!targetFile.exists()) {
            try {
                targetFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        FileOutputStream outputStream;
        try {
            outputStream = new FileOutputStream(targetFile);
            OutputStreamWriter osw = new OutputStreamWriter(outputStream);
            osw.write(content);
            osw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 把基础类型名称从Java转换为C#
     *
     * @param field              实体字段
     * @param modelDirectoryName 实体存储目录
     * @return
     */
    private String getFieldTypeString(Field field, String modelDirectoryName) {
        Class fieldClass = field.getType();
        if (fieldClass.equals(Integer.class) || fieldClass.equals(int.class)) {
            return "int";
        } else if (fieldClass.equals(Long.class) || fieldClass.equals(long.class)) {
            return "long";
        } else if (fieldClass.equals(BigDecimal.class)) {
            return "decimal";
        } else if (fieldClass.equals(Byte.class) || fieldClass.equals(byte.class)) {
            return "byte";
        } else if (fieldClass.equals(Short.class) || fieldClass.equals(short.class)) {
            return "short";
        } else if (fieldClass.equals(Float.class) || fieldClass.equals(Float.class)) {
            return "float";
        } else if (fieldClass.equals(Double.class) || fieldClass.equals(double.class)) {
            return "double";
        } else if (fieldClass.equals(Boolean.class) || fieldClass.equals(boolean.class)) {
            return "bool";
        } else if (fieldClass.equals(Char.class) || fieldClass.equals(char.class)) {
            return "char";
        } else if (fieldClass.equals(String.class)) {
            return "string";
        } else if (fieldClass.equals(Date.class)) {
            return "DateTime";
        } else if (fieldClass.equals(Object.class)) {
            return "object";
        } else {
            if (fieldClass.isAssignableFrom(List.class)) {
                Type fc = field.getGenericType();
                if (fc instanceof ParameterizedType) // 【3】如果是泛型参数的类型
                {
                    ParameterizedType pt = (ParameterizedType) fc;
                    Type[] genericTypes = pt.getActualTypeArguments();
                    if (genericTypes != null && genericTypes.length > 0) {
                        Class genericClazz = (Class) genericTypes[0]; //【4】 得到泛型里的class类型对象。
                        if (!genericClazz.isPrimitive() && !genericClazz.equals(String.class) && !genericClazz.equals(Date.class) && !genericClazz.equals(BigDecimal.class) && !genericClazz.equals(String.class)) {
                            buildModelCodeString(genericClazz, modelDirectoryName);
                        }
                        return "List<" + genericClazz.getName() + ">";
                    } else {
                        return "List<" + fc.getTypeName() + ">";
                    }
                } else {
                    return "List<" + fc.getClass().getName() + ">";
                }
            } else {
                String className = fieldClass.getName();
                buildModelCodeString(fieldClass, modelDirectoryName);
                return className;
            }
        }
    }

    /**
     * 把基础类型名称从Java转换为C#
     *
     * @param param              方法参数
     * @param modelDirectoryName 实体存储目录
     * @return
     */
    private String getParameterTypeString(Parameter param, String modelDirectoryName) {
        Class parameterClass = param.getType();
        if (parameterClass.equals(Integer.class) || parameterClass.equals(int.class)) {
            return "int";
        } else if (parameterClass.equals(Long.class) || parameterClass.equals(long.class)) {
            return "long";
        } else if (parameterClass.equals(BigDecimal.class)) {
            return "decimal";
        } else if (parameterClass.equals(Byte.class) || parameterClass.equals(byte.class)) {
            return "byte";
        } else if (parameterClass.equals(Short.class) || parameterClass.equals(short.class)) {
            return "short";
        } else if (parameterClass.equals(Float.class) || parameterClass.equals(Float.class)) {
            return "float";
        } else if (parameterClass.equals(Double.class) || parameterClass.equals(double.class)) {
            return "double";
        } else if (parameterClass.equals(Boolean.class) || parameterClass.equals(boolean.class)) {
            return "bool";
        } else if (parameterClass.equals(Char.class) || parameterClass.equals(char.class)) {
            return "char";
        } else if (parameterClass.equals(String.class)) {
            return "string";
        } else if (parameterClass.equals(Date.class)) {
            return "DateTime";
        } else if (parameterClass.equals(Object.class)) {
            return "object";
        } else {
            if (parameterClass.isAssignableFrom(List.class)) {
                Type fc = param.getType();
                if (fc instanceof ParameterizedType) // 【3】如果是泛型参数的类型
                {
                    ParameterizedType pt = (ParameterizedType) fc;
                    Type[] genericTypes = pt.getActualTypeArguments();
                    if (genericTypes != null && genericTypes.length > 0) {
                        Class genericClazz = (Class) genericTypes[0]; //【4】 得到泛型里的class类型对象。
                        if (!genericClazz.isPrimitive() && !genericClazz.equals(String.class) && !genericClazz.equals(Date.class) && !genericClazz.equals(BigDecimal.class) && !genericClazz.equals(String.class)) {
                            buildModelCodeString(genericClazz, modelDirectoryName);
                        }
                        return "List<" + genericClazz.getName() + ">";
                    } else {
                        return "List<" + fc.getTypeName() + ">";
                    }
                } else {
                    return "List<" + fc.getClass().getName() + ">";
                }
                //buildModelCodeString(parameterClass, modelDirectoryName);
                //return "List<" + parameterClass.getName() + ">";
            } else {
                String className = parameterClass.getName();
                buildModelCodeString(parameterClass, modelDirectoryName);
                return className;
            }
        }
    }

    /**
     * 服务Action列表
     */
    private ArrayList<MS_ServiceActionInfo> serviceActionList = new ArrayList();

    /**
     * 添加服务Action到列表中
     *
     * @param serviceUri
     * @param outputModelType
     * @param params
     */
    private void appendServiceAction(String serviceUri, String outputModelType, HashMap<String, String> params, String methodDescription) {
        MS_ServiceActionInfo sai = new MS_ServiceActionInfo();
        sai.setTargetUri(serviceUri);
        sai.setOutputModel(outputModelType);
        sai.setParamsDic(params);
        sai.setActionDescription(methodDescription);
        serviceActionList.add(sai);
    }

    /**
     * 构建访问服务
     *
     * @param tempDirectoryName 文件临时目录名称
     */
    private void buildService(String tempDirectoryName) {
        StringBuilder txt = new StringBuilder();
        txt.append("using System;").append("\r\n");
        txt.append("using Fang.Contract.WebUtil;").append("\r\n");
        txt.append("\r\n");
        txt.append("namespace Fang.Contract.Biz.").append(getServiceName()).append("\r\n");
        txt.append("{\r\n");
        txt.append("\tpublic class Service\r\n");
        txt.append("\t{\r\n");
        for (MS_ServiceActionInfo sai : serviceActionList) {
            txt.append("\t\t/// <summary>\r\n");
            txt.append("\t\t/// ").append(sai.getActionDescription()).append("\r\n");
            txt.append("\t\t/// </summary>\r\n");
            txt.append("\t\tpublic static ").append(sai.getOutputModel()).append(" ").append(sai.buildMethodName()).append("(").append(sai.buildMethodDefineParameters()).append(")\r\n");
            txt.append("\t\t{\r\n");
            if (sai.getParamsDic().keySet().size() == 1) {
                String parameterType = sai.getFirstParameterType();
                String parameterName = sai.getFirstParameterName();

                if (parameterType.contains(".")) {
                    txt.append("\t\t\treturn Proxy.ExecHandler.GetResponseModel<" + sai.getOutputModel() + ">(\"" + applicationName + "\", \"" + sai.getTargetUri() + "\", " + parameterName + ");\r\n");
                } else {
                    txt.append("\t\t\tstring PostData = ").append(sai.buildPostDataCode()).append(";\r\n");
                    txt.append("\t\t\treturn Proxy.ExecHandler.GetResponseModel<" + sai.getOutputModel() + ">(\"" + applicationName + "\", \"" + sai.getTargetUri() + "\", PostData);\r\n");
                }
            } else if (sai.getParamsDic().keySet().size() > 1) {
                txt.append("\t\t\tstring PostData = ").append(sai.buildPostDataCode()).append(";\r\n");
                txt.append("\t\t\treturn Proxy.ExecHandler.GetResponseModel<" + sai.getOutputModel() + ">(\"" + applicationName + "\", \"" + sai.getTargetUri() + "\", PostData);\r\n");
            }

            txt.append("\t\t}\r\n");
        }
        txt.append("\t}\r\n");
        txt.append("}");

        buildAndSaveFile(tempDirectoryName + "/" + "Service.cs", txt.toString());
    }

    private ArrayList<String> modelTypeList = new ArrayList<>();

    public void buildZipFile(String sourceDIR, String targetZipFile) {
        File targetFile = new File(targetZipFile);
        if (!targetFile.exists()) {
            try {
                targetFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        zip(targetZipFile, new File(sourceDIR));
    }

    public boolean zip(String zipFileName, File... files) {
        ZipOutputStream out = null;
        BufferedOutputStream bo = null;
        try {
            createDir(zipFileName);
            out = new ZipOutputStream(new FileOutputStream(zipFileName));
            for (int i = 0; i < files.length; i++) {
                if (null != files[i]) {
                    zip(out, files[i], files[i].getName());
                }
            }
            // 输出流关闭
            out.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 目录不存在时,先创建目录
     *
     * @param zipFileName
     */
    private static void createDir(String zipFileName) {
        String filePath = StringUtils.substringBeforeLast(zipFileName, "/");
        File targetFile = new File(filePath);
        if (!targetFile.exists()) {
            //目录不存在时,先创建目录
            targetFile.mkdirs();
        }
    }

    /**
     * 执行压缩
     *
     * @param out  ZIP输入流
     * @param f    被压缩的文件
     * @param base 被压缩的文件名
     */
    private static void zip(ZipOutputStream out, File f, String base) {
        try {
            //压缩目录
            if (f.isDirectory()) {
                try {
                    File[] fl = f.listFiles();
                    // 创建zip实体
                    if (fl.length == 0) {
                        out.putNextEntry(new ZipEntry(base + "/"));
                    }
                    // 递归遍历子文件夹
                    for (int i = 0; i < fl.length; i++) {
                        zip(out, fl[i], base + "/" + fl[i].getName());
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                //压缩单个文件
                out.putNextEntry(new ZipEntry(base));
                // 创建zip实体
                FileInputStream in = new FileInputStream(f);
                BufferedInputStream bi = new BufferedInputStream(in);
                int b;
                while ((b = bi.read()) != -1) {
                    // 将字节流写入当前zip目录
                    out.write(b);
                }
                //关闭zip实体
                out.closeEntry();
                // 输入流关闭
                in.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  其中使用的Domain

package com.fang.microservice.cloud.domain;

import java.util.HashMap;

/**
 * Created by Administrator on 2017/5/9.
 */
public class MS_ServiceActionInfo {
    private String targetUri;

    private String outputModel;

    private HashMap<String, String> paramsDic = new HashMap<>();

    private String actionDescription;

    public String getTargetUri() {
        return targetUri;
    }

    public void setTargetUri(String targetUri) {
        this.targetUri = targetUri;
    }

    public String getOutputModel() {
        return outputModel;
    }

    public void setOutputModel(String outputModel) {
        this.outputModel = outputModel;
    }

    public HashMap<String, String> getParamsDic() {
        return paramsDic;
    }

    public void setParamsDic(HashMap<String, String> paramsDic) {
        this.paramsDic = paramsDic;
    }

    public String getActionDescription() {
        return actionDescription;
    }

    public void setActionDescription(String actionDescription) {
        this.actionDescription = actionDescription;
    }

    /**
     * 构建请求方法名
     * @return
     */
    public String buildMethodName() {
        String tempName = targetUri.replace("/", "_");
        if (targetUri.startsWith("/")) {
            tempName = tempName.substring(1);
        }
        tempName = tempName.substring(0, 1).toUpperCase() + tempName.substring(1);
        return tempName;
    }

    /**
     * 构建POST数据
     * @return
     */
    public String buildPostDataCode() {
        StringBuilder txt = new StringBuilder();
        int paramIndex = 0;
        for (String paramName : paramsDic.keySet()) {
            paramIndex++;
            if (paramIndex < paramsDic.keySet().size()) {
                txt.append("\"").append(paramName).append("=\"").append(" + ").append(paramName).append(" + \"&\" + ");
            } else {
                txt.append("\"").append(paramName).append("=\"").append(" + ").append(paramName);
            }
        }
        return txt.toString();
    }

    /**
     * 构建方法请求列表
     * @return
     */
    public String buildMethodCallParameters(){
        StringBuilder txt = new StringBuilder();
        int paramIndex = 0;
        for (String paramName : paramsDic.keySet()) {
            paramIndex++;
            if (paramIndex < paramsDic.keySet().size()) {
                txt.append(paramName).append(", ");
            } else {
                txt.append(paramName);
            }
        }
        return txt.toString();
    }

    /**
     * 构建方法定义参数列表
     * @return
     */
    public String buildMethodDefineParameters(){
        StringBuilder txt = new StringBuilder();
        int paramIndex = 0;
        for (String paramName : paramsDic.keySet()) {
            paramIndex++;
            if (paramIndex < paramsDic.keySet().size()) {
                txt.append(paramsDic.get(paramName)).append(" ").append(paramName).append(", ");
            } else {
                txt.append(paramsDic.get(paramName)).append(" ").append(paramName);
            }
        }
        return txt.toString();
    }

    /**
     * 在参数唯一时获取参数类型
     * @return
     */
    public String getFirstParameterType(){
        for(String paramName : paramsDic.keySet()){
            return paramsDic.get(paramName);
        }
        return "";
    }

    /**
     * 在参数唯一时获取参数名
     * @return
     */
    public String getFirstParameterName(){
        for(String paramName : paramsDic.keySet()){
            return paramName;
        }
        return "";
    }
}

  实际场景:

在Spring Cloud项目中,Zuul网关定制一个界面,提供所有服务的聚合列表,列表中提供每一个服务可用接口Model生成地址,该地址指向本文中Controller中的生成地址,对接方可在页面上直接获取到调用服务所用的C#版本Model的Zip压缩包,直接解压缩到本地项目即可使用。 

为方便C#同事使用,特提供C#版本访问代理工具类(因本人曾是C#程序员)

using System;
using System.Collections.Generic;

namespace Fang.Contract.WebUtil
{
    /// <summary>
    /// 服务环境标识
    /// </summary>
    public enum EnviormentEnum
    {
        /// <summary>
        /// 测试环境
        /// </summary>
        test,
        /// <summary>
        /// 生产环境
        /// </summary>
        prod
    }
    public class ActionHandler
    {
        /// <summary>
        /// 请求环境
        /// </summary>
        private EnviormentEnum ServiceEnviorment
        {
            get; set;
        }
        /// <summary>
        /// 系统请求基础域名
        /// </summary>
        private string ServiceDomain
        {
            get
            {
                if (ServiceEnviorment == EnviormentEnum.test)
                {
                    return "zuul.center.contract.microservice.test.fang.com";
                }
                else if (ServiceEnviorment == EnviormentEnum.prod)
                {
                    return "zuul.contract.microservice.ggpt.fang.com";
                }
                else
                {
                    return string.Empty;
                }
            }
        }
        /// <summary>
        /// 请求平台名称
        /// </summary>
        public string PlatformCode = "WEB";
        /// <summary>
        /// 请求平台令牌
        /// </summary>
        public string PlatformToken = "f13f6f52-28b0-11e7-9269-a0423f2f18c8";
        /// <summary>
        /// 请求认证Header
        /// </summary>
        private Dictionary<string, string> PlatformHeader = new Dictionary<string, string>();
        /// <summary>
        /// 服务�?
        /// </summary>
        public string ServiceId { get; set; }
        /// <summary>
        /// 服务地址
        /// </summary>
        public object ServiceUrl { get; set; }
        public ActionHandler()
        {

        }
        public ActionHandler(EnviormentEnum _Enviroment, string _PlatformCode, string _PlatformToken)
        {
            this.ServiceEnviorment = _Enviroment;
            this.PlatformCode = _PlatformCode;
            this.PlatformToken = _PlatformToken;
            this.PlatformHeader.Add(this.PlatformCode, this.PlatformToken);
        }

        private string BuildServiceUri()
        {
            return "http://" + ServiceDomain + "/" + ServiceId + "/" + ServiceUrl;
        }
        /// <summary>
        /// 获得字符串数�?
        /// </summary>
        /// <param name="ServiceId">服务Id</param>
        /// <param name="ServiceUrl">服务地址</param>
        /// <param name="RequestModel">输入实体</param>
        /// <returns></returns>
        public string GetResponseString(string ServiceId, string ServiceUrl, object RequestModel)
        {
            NetUtility wu = new NetUtility();
            string requestText = Newtonsoft.Json.JsonConvert.SerializeObject(RequestModel);
            string url = BuildServiceUri();
            string responseText = wu.DoPost(url, requestText, this.PlatformHeader);
            return responseText;
        }
        /// <summary>
        /// 获得字符串数�?
        /// </summary>
        /// <param name="ServiceId">服务Id</param>
        /// <param name="ServiceUrl">服务地址</param>
        /// <param name="PostData">输入文本</param>
        /// <returns></returns>
        public string GetResponseString(string ServiceId, string ServiceUrl, string PostData)
        {
            NetUtility wu = new NetUtility();
            string requestText = PostData;
            string url = BuildServiceUri();
            string responseText = wu.DoPost(url, requestText, this.PlatformHeader);
            return responseText;
        }
        /// <summary>
        /// 获得实体对象
        /// </summary>
        /// <typeparam name="T">输出实体类型</typeparam>
        /// <param name="ServiceId">服务Id</param>
        /// <param name="ServiceUrl">服务地址</param>
        /// <param name="RequestModel">输入实体</param>
        /// <returns></returns>
        public T GetResponseModel<T>(string ServiceId, string ServiceUrl, object RequestModel)
        {
            try
            {
                string data = GetResponseString(ServiceId, ServiceUrl, RequestModel);
                if (string.IsNullOrEmpty(data))
                {
                    return default(T);
                }
                return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(data);
            }
            catch (Exception)
            {
                return default(T);
            }
        }

        /// <summary>
        /// 获得实体对象
        /// </summary>
        /// <typeparam name="T">输出实体类型</typeparam>
        /// <param name="ServiceId">服务Id</param>
        /// <param name="ServiceUrl">服务地址</param>
        /// <param name="RequestModel">输入实体</param>
        /// <returns></returns>
        public T GetResponseModel<T>(string ServiceId, string ServiceUrl, string PostData)
        {
            try
            {
                string data = GetResponseString(ServiceId, ServiceUrl, PostData);
                if (string.IsNullOrEmpty(data))
                {
                    return default(T);
                }
                return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(data);
            }
            catch (Exception)
            {
                return default(T);
            }
        }
    }
}
using Fang.Contract.WebUtil;

namespace Fang.Contract.Biz
{
    public class Proxy
    {
        private static ActionHandler handler;

        public static ActionHandler ExecHandler
        {
            get
            {
                if (handler == null)
                {
                    handler = new ActionHandler(EnviormentEnum.test, "", "");
                }
                return handler;
            }
        }
    }
}
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Text;

namespace Fang.Contract.WebUtil
{
    /// <summary>
    /// 网络工具类
    /// </summary>
    [Description("网络工具类")]
    public sealed class NetUtility
    {
        /// <summary>
        /// 请求超时时间
        /// </summary>
        private int _timeout = 100000;

        /// <summary>
        /// 请求与响应的超时时间
        /// </summary>
        public int Timeout
        {
            get { return this._timeout; }
            set { this._timeout = value; }
        }

        #region POST请求
        /// <summary>
        /// 执行HTTP POST请求
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="parameters">请求参数</param>
        /// <returns>HTTP响应</returns>
        public string DoPost(string url, string postText, Dictionary<string, string> headers)
        {
            try
            {
                HttpWebRequest req = GetWebRequest(url, "POST");
                req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
                if (headers != null && headers.Count > 0)
                {
                    foreach (string key in headers.Keys)
                    {
                        req.Headers.Add(key, headers[key]);
                    }
                }

                byte[] postData = Encoding.UTF8.GetBytes(postText);
                Stream reqStream = req.GetRequestStream();
                reqStream.Write(postData, 0, postData.Length);
                reqStream.Close();
                HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
                Encoding encoding = Encoding.GetEncoding("utf-8");
                return GetResponseAsString(rsp, encoding);
            }
            catch
            {
                return string.Empty;
            }
        }
        #endregion

        /// <summary>
        /// 获取HTTP请求对象
        /// </summary>
        /// <param name="url"></param>
        /// <param name="method"></param>
        /// <returns></returns>
        public HttpWebRequest GetWebRequest(string url, string method)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.ServicePoint.Expect100Continue = false;
            req.Method = method;
            req.KeepAlive = true;
            req.UserAgent = "";
            req.Timeout = this._timeout;
            req.ReadWriteTimeout = this._timeout;
            return req;
        }

        /// <summary>
        /// 把响应流转换为文本
        /// </summary>
        /// <param name="rsp">响应流对象</param>
        /// <param name="encoding">编码方式</param>
        /// <returns>响应文本</returns>
        public string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
        {
            Stream stream = null;
            StreamReader reader = null;

            try
            {
                // 以字符流的方式读取HTTP响应
                stream = rsp.GetResponseStream();
                reader = new StreamReader(stream, encoding);
                return reader.ReadToEnd();
            }
            finally
            {
                // 释放资源
                if (reader != null) reader.Close();
                if (stream != null) stream.Close();
                if (rsp != null) rsp.Close();
            }
        }
    }
}