<%@ page language="java" import="java.util.*, java.lang.management.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>系统参数输出</title>
<style type="text/css">
table
{
border-collapse:collapse;
}
td
{
border:1px solid #427BD6;
}
</style>
</head>
<body style="background-color:#f2f2f2;">
<h1>环境变量</h1>
<table>
<%
Map<String, String> map = System.getenv();
//RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
//Map<String, String> map = runtimeMxBean.getSystemProperties();
for(String key : map.keySet())
{
out.println("<tr>");
out.println("<td>");
out.println(key);
out.println("</td>");
out.println("<td>");
out.println(map.get(key));
out.println("</td>");
out.println("</tr>");
}
%>
</table>
<h1>JVM参数</h1>
<table>
<%
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
out.println("<tr>");
out.println("<td>");
out.println(runtimeMxBean.getVmVendor()+" || "+runtimeMxBean.getVmName() +" || "+ runtimeMxBean.getVmVersion());
out.println("</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>");
out.println(runtimeMxBean.getSpecVendor()+" || "+runtimeMxBean.getSpecName() +" || "+ runtimeMxBean.getSpecVersion());
out.println("</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>");
out.println(runtimeMxBean.getName()+" || "+runtimeMxBean.getStartTime() +" || "+ runtimeMxBean.getUptime());
out.println("</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>");
out.println("MaxMemory="+Runtime.getRuntime().maxMemory()/1024/1024 + "m ");
out.println("TotalMemory="+Runtime.getRuntime().totalMemory()/1024/1024 + "m ");
out.println("FreeMemory="+Runtime.getRuntime().freeMemory()/1024/1024 + "m ");
out.println("</td>");
out.println("</tr>");
List<MemoryPoolMXBean> memoryPoolMXBeans = ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean bean : memoryPoolMXBeans)
{
out.println("<tr>");
out.println("<td>");
out.println(bean.getName()+" || "+bean.getType()+" || Init="+bean.getUsage().getInit()/1024/1024+
"m Max="+bean.getUsage().getMax()/1024/1024+"m Used="+bean.getUsage().getUsed()/1024/1024+
"m Committed="+bean.getUsage().getCommitted()/1024/1024+"m ");
out.println("</td>");
out.println("</tr>");
}
List<String> arguments = runtimeMxBean.getInputArguments();
for(String arg:arguments)
{
out.println("<tr>");
out.println("<td>");
out.println(arg);
out.println("</td>");
out.println("</tr>");
}
%>
</table>
<h1>系统参数</h1>
<table>
<%
Properties props = System.getProperties();
for(Object o:props.keySet())
{
out.println("<tr>");
out.println("<td>");
out.println(o);
out.println("</td>");
out.println("<td>");
out.println(props.get(o));
out.println("</td>");
out.println("</tr>");
}
%>
</table>
</body>
</html>
Author Archives: neohope
XCode7编译Osirix
1、到Github下载源码
https://github.com/pixmeo/osirix
2、用Xcode打开Osirix.xcodeproj,提示要升级配置,升级
3、运行任务Unzip Binaries
4、Osirix目标调整为x86(上面的Binaries都是x86的)
5、编译Osirix,恩,出错了是吧
6、下载openssl库
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew install openssl
将/usr/local/opt/openssl/include添加到include路径
将/usr/local/opt/openssl/lib添加到lib路径
7、在Osirix项目中,去除Message依赖
8、还需要调整几个编译错误和几个连接错误,然后就好了
其中有一个错误是有多个jaritab符号,可以找到三个,然后改为不同名或改为static就好了
其余问题都是很简单的问题咯
9、搞定
Java四种引用方式
最近写了个例子,说明了一下强引用、软引用、弱引用、虚引用的区别。
1、NString.java
package com.neohope.reference;
/**
* Created by Hansen
*/
public class NString {
private String name;
private String value;
public NString(String name, String value)
{
this.name = name;
this.value=value;
}
public NString(String name, StringBuilder builder)
{
this.name = name;
this.value=builder.toString();
}
public String Name()
{
return name;
}
public String Value()
{
return value;
}
@Override
protected void finalize()
{
System.out.println(">> "+Name()+" finalize called");
try {
super.finalize();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
2、TestReferenceA.java
package com.neohope.reference;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
/**
* Created by Hansen
* JVM参数:
* -XX:+PrintGCDetails
* -Xms6m -Xmx12m
*/
public class TestReferenceA {
public static void main(String[] args) {
//申请内存
Runtime rt=Runtime.getRuntime();
System.out.println("Total memory is "+rt.totalMemory());
int MemSize = 1024*1024*1;
StringBuilder builder = new StringBuilder(MemSize);
for (int i=0;i<MemSize/8;i++) {
builder.append("ABCDEFGH");
}
System.out.println("Total memory is "+rt.totalMemory());
//用s00与s01两个大字符串演示强引用与软引用的区别
NString s00 = new NString("s00",builder);
NString s01 = new NString("s01",builder);
//s02与s03演示WeakReference的两种用法
NString s02 = new NString("s02","s03");
String key03 = new String("k03");
NString s03 = new NString("s03","s03");
//s04演示PhantomReference
NString s04 = new NString("s04","s04");
System.out.println("Total memory is "+rt.totalMemory());
//第1类、强引用的对象,也最常用到的类型,内存不足时JVM将抛出异常也不要释放这些内存
NString strongRef = s00;
//第2类、只有软引用的数据,内存不足时JVM会回收这些内存
SoftReference<NString> softRef = new SoftReference<NString>(s01);
//第3类、只有弱引用的数据,无论内存是否充足JVM会回收这些内存,也就是弱引用不会影响对象的生命周期
WeakReference<NString> weakRef = new WeakReference<NString>(s02);
//WeakHashMap很有用,当key022为null时,s022也就会被GC咯
WeakHashMap weakHashMap = new WeakHashMap();
weakHashMap.put(key03,s03);
//第4类、只有虚引用的数据,一开始refQueue为空,被GC才会有值
ReferenceQueue refQueue = new ReferenceQueue<String>();
PhantomReference<NString> phantomRef = new PhantomReference<NString>(s04, refQueue);
//有强引用时,输出初始化情况
System.out.println("With strong ref strongRef is " + (strongRef==null?"null":"not null"));
System.out.println("With strong ref softRef is " + (softRef.get()==null?"null":"not null"));
System.out.println("With strong ref weakRef is " + (weakRef.get()==null?"null":"not null"));
System.out.println("With strong ref weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//这里为null,当对象被GC时,会得到虚引用对象
System.out.println("With strong ref refQueue has " + refQueue.poll());
System.out.println();
//去掉初始的强引用
s00 = null;
s01 = null;
s02 = null;
s03 = null;
s04 = null;
//多数情况下,没有来得及GC
System.out.println("Before gc strongRef is " + (strongRef==null?"null":"not null"));
System.out.println("Before gc softRef is " + (softRef.get()==null?"null":"not null"));
System.out.println("Before gc weakRef is " + (weakRef.get()==null?"null":"not null"));
System.out.println("Before gc weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//null,当对象被GC时,会得到虚引用对象
System.out.println("Before gc refQueue has " + refQueue.poll());
System.out.println();
//强制GC
System.gc();
System.out.println("After first gc strongRef is " + (strongRef==null?"null":"not null"));
System.out.println("After first gc softRef is " + (softRef.get()==null?"null":"not null"));
//null,weakRef已经被释放了
System.out.println("After first gc weakRef is " + (weakRef.get()==null?"null":"not null"));
System.out.println("After first gc weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//与运行环境及GC方法有关,会出现一次有值的情况,然后一直为null
System.out.println("After first gc refQueue has " + refQueue.poll());
System.out.println();
//将key03设为null,强制GC
key03 = null;
System.gc();
System.out.println("After second gc strongRef is " + (strongRef==null?"null":"not null"));
System.out.println("After second gc softRef is " + (softRef.get()==null?"null":"not null"));
//null
System.out.println("After second gc weakRef is " + (weakRef.get()==null?"null":"not null"));
//empty,由于key被设为空,则会释放掉弱引用对象了
System.out.println("After second gc weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//与运行环境及GC方法有关,会出现一次有值的情况,然后一直为null
System.out.println("After second gc refQueue has " + refQueue.poll());
System.out.println();
//Finalization
System.runFinalization();
System.out.println("After Finalization strongRef is " + (strongRef==null?"null":"not null"));
System.out.println("After Finalization softRef is " + (softRef.get()==null?"null":"not null"));
//null
System.out.println("After Finalization weakRef is " + (weakRef.get()==null?"null":"not null"));
//empty
System.out.println("After Finalization weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//与运行环境及GC方法有关,会出现一次有值的情况,然后一直为null
System.out.println("After Finalization refQueue has " + refQueue.poll());
System.out.println();
//申请内存,造成内存不足
System.out.println("Total memory is "+rt.totalMemory());
StringBuilder builder2 = new StringBuilder(MemSize);
for (int i=0;i<MemSize/8;i++) {
builder2.append("ABCDEFGH");
}
NString tmp0 = new NString("tmp0", builder2);
System.out.println("Total memory is "+rt.totalMemory());
System.out.println("When mem is low strongRef is " + (strongRef==null?"null":"not null"));
//null,内存不足时软引用会被释放
System.out.println("When mem is low softRef is " + (softRef.get()==null?"null":"not null"));
//null
System.out.println("When mem is low weakRef is " + (weakRef.get()==null?"null":"not null"));
//empty
System.out.println("When mem is low weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//与运行环境及GC方法有关,会出现一次有值的情况,然后一直为null
System.out.println("When mem is low refQueue has " + refQueue.poll());
System.out.println();
//再次申请内存,JMV会内存爆掉
NString tmp1 = null;
try
{
tmp1 = new NString("tmp1",builder2);
}
catch(OutOfMemoryError ex)
{
System.out.println("Not enough memory");
}
//null
System.out.println("tmp1 is " + (tmp1==null?"null":"not null"));
//就算是抛出OutOfMemoryError,仍然不会释放
System.out.println("When not enough memory strongRef is " + (strongRef==null?"null":"not null"));
//null
System.out.println("When not enough memory softRef is " + (softRef.get()==null?"null":"not null"));
//null
System.out.println("When not enough memory weakRef is " + (weakRef.get()==null?"null":"not null"));
//empty
System.out.println("When not enough memory weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//null
System.out.println("When not enough memory refQueue has " + refQueue.poll());
System.out.println();
}
}
3、输出
Total memory is 6094848 Total memory is 6094848 Total memory is 11390976 With strong ref strongRef is not null With strong ref softRef is not null With strong ref weakRef is not null With strong ref weakHashMap is not empty With strong ref refQueue has null Before gc strongRef is not null Before gc softRef is not null Before gc weakRef is not null Before gc weakHashMap is not empty Before gc refQueue has null After first gc strongRef is not null After first gc softRef is not null After first gc weakRef is null After first gc weakHashMap is not empty >> s04 finalize called After first gc refQueue has null >> s02 finalize called After second gc strongRef is not null After second gc softRef is not null After second gc weakRef is null After second gc weakHashMap is not empty After second gc refQueue has java.lang.ref.PhantomReference@15d63da After Finalization strongRef is not null After Finalization softRef is not null After Finalization weakRef is null After Finalization weakHashMap is not empty After Finalization refQueue has null Total memory is 14221312 Total memory is 14221312 When mem is low strongRef is not null When mem is low softRef is not null When mem is low weakRef is null When mem is low weakHashMap is not empty When mem is low refQueue has null >> s01 finalize called Not enough memory tmp1 is null When not enough memory strongRef is not null When not enough memory softRef is null When not enough memory weakRef is null When not enough memory weakHashMap is empty When not enough memory refQueue has null
制作Ubuntu安装U盘
本文以Ubuntu为例,讲解一下Linux安装U盘的制作方法。
首先,下载安装盘的ISO镜像。
http://releases.ubuntu.com/
然后要知道,自己的BIOS模式是什么,是Legecy还是UEFI。这个通过查看操作系统信息或BIOS设置就可以知道。
如果是Legecy模式:
1、下载工具universal usb installer
2、制作安装U盘。
3、重启,从U盘启动即可
如果是UEFI模式:
1、那只需要将盘格式化为FAT32模式,然后将64位的ISO镜像解压到盘的根目录就好了。
2、保证在盘的根目录可以开单到UEFI目录。
3、重启,关闭BIOS中的安全启动保护,从而可以用U盘启动
4、重启,从U盘启动即可
5、安装后,记得打开BIOS中安全安全启动保护
Windows创建符号连接
1、mklink
该命令可以创建符号链接、硬链接及快捷方式。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D Creates a directory symbolic link. Default is a file
symbolic link.
/H Creates a hard link instead of a symbolic link.
/J Creates a Directory Junction.
Link specifies the new symbolic link name.
Target specifies the path (relative or absolute) that the new link
refers to.
2、fsutil hardlink
该命令可以创建硬链接。
create Create a hardlink list Enumerate hardlinks on a file
3、junction
该工具是SYSINTERNALS提供的,可以新增或删除符号链接。
The first usage is for displaying reparse point information, the
second usage is for creating a junction point, and the last for
deleting a junction point:
usage: junction.exe [-s] [-q] <file or directory>
-q Don't print error messages (quiet)
-s Recurse subdirectories
usage: junction.exe <junction directory> <junction target>
example: junction d:\link c:\windows
usage: junction.exe -d <junction directory>
JMX获取Tomcat管理信息
1、首先配置JVM
JVM要放到NTFS卷中,在JVM路径下找到jmxremote.access及jmxremote.password.template两个文件。
将jmxremote.password.template复制一份为jmxremote.password,对运行用户可读,对普通用户不可读。
2、配置Tomcat启动参数
修改catalina.bat,增加下面一行
SET "JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=8686 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true"
3、启动Tomcat
4、客户端程序JMXInfo.java
package com.neohope.jmx.test;
import java.io.IOException;
import java.lang.management.MemoryUsage;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class JMXInfo {
public static void main(String[] args) throws Exception {
JMXConnector connector = null;
try {
// 获取JMX连接
String ip = "127.0.0.1";
String port = "8686";
JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + ip + ":" + port + "/jmxrmi");
Map<String, String[]> map = new HashMap<String, String[]>();
String[] credentials = new String[] { "controlRole", "R&D" };
map.put("jmx.remote.credentials", credentials);
connector = JMXConnectorFactory.connect(serviceURL, map);
MBeanServerConnection mbsc = connector.getMBeanServerConnection();
// 获取JVM信息
ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
System.out.println("厂商:" + (String) mbsc.getAttribute(runtimeObjName, "VmVendor"));
System.out.println("程序:" + (String) mbsc.getAttribute(runtimeObjName, "VmName"));
System.out.println("版本:" + (String) mbsc.getAttribute(runtimeObjName, "VmVersion"));
// 获取JVM运行时间
Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName, "StartTime"));
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("启动时间:" + df.format(starttime));
Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime");
System.out.println("持续工作时间:" + JMXInfo.formatTimeSpan(timespan));
// 获取JVM内存信息
ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
MemoryUsage heapMemoryUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(heapObjName, "HeapMemoryUsage"));
long heapMaxMemory = heapMemoryUsage.getMax();
long heapCommitMemory = heapMemoryUsage.getCommitted();
long heapUsedMemory = heapMemoryUsage.getUsed();
System.out.println("heap:" + (double) heapUsedMemory * 100 / heapCommitMemory + "%");
MemoryUsage nonheapMemoryUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(heapObjName, "NonHeapMemoryUsage"));
long nonHeapCommitMemory = nonheapMemoryUsage.getCommitted();
long nonHeapUsedMemory = heapMemoryUsage.getUsed();
System.out.println("nonheap:" + (double) nonHeapUsedMemory * 100 / nonHeapCommitMemory + "%");
ObjectName permObjName = new ObjectName("java.lang:type=MemoryPool,name=Perm Gen");
MemoryUsage permGenUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(permObjName, "Usage"));
long permCommitted = permGenUsage.getCommitted();
long permUsed = heapMemoryUsage.getUsed();
System.out.println("perm gen:" + (double) permUsed * 100 / permCommitted + "%");
// All Domains
for (int j = 0; j < mbsc.getDomains().length; j++) {
System.out.println(mbsc.getDomains()[j]);
}
// All MBeans
Set<ObjectInstance> MBeanset = mbsc.queryMBeans(null, null);
System.out.println("MBeanset.size() : " + MBeanset.size());
Iterator<ObjectInstance> MBeansetIterator = MBeanset.iterator();
while (MBeansetIterator.hasNext()) {
ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator.next();
ObjectName objectName = objectInstance.getObjectName();
String canonicalName = objectName.getCanonicalName();
System.out.println("canonicalName : " + canonicalName);
}
// 全部线程池
ObjectName threadpoolObjName = new ObjectName("Catalina:type=ThreadPool,*");
Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null);
for (ObjectName obj : s2) {
System.out.println("端口名:" + obj.getKeyProperty("name"));
ObjectName objname = new ObjectName(obj.getCanonicalName());
System.out.println("最大线程数:" + mbsc.getAttribute(objname, "maxThreads"));
System.out.println("当前线程数:" + mbsc.getAttribute(objname, "currentThreadCount"));
System.out.println("繁忙线程数:" + mbsc.getAttribute(objname, "currentThreadsBusy"));
}
//HTTP Thread Pool
ObjectName threadPoolObjName = new ObjectName("Catalina:type=ThreadPool,*");
Set<ObjectName> threadPoolObjNames = mbsc.queryNames(threadPoolObjName, null);
for (ObjectName obj : threadPoolObjNames) {
if (obj.getKeyProperty("name").contains("http")) {
ObjectName objname = new ObjectName(obj.getCanonicalName());
System.out.println("HTTP最大线程数:"+ mbsc.getAttribute(objname, "maxThreads").toString());// 最大线程数
System.out.println("HTTP当前线程数:"+ mbsc.getAttribute(objname, "currentThreadCount").toString());// 当前线程数
System.out.println("HTTP繁忙线程数:" + mbsc.getAttribute(objname, "currentThreadsBusy").toString());// 繁忙线程数
}
}
// 全部应用
ObjectName managerObjName = new ObjectName("Catalina:type=Manager,*");
Set<ObjectName> s = mbsc.queryNames(managerObjName, null);
for (ObjectName obj : s) {
System.out.println("应用名:" + obj.getKeyProperty("path"));
ObjectName objname = new ObjectName(obj.getCanonicalName());
System.out.println("最大会话数:" + mbsc.getAttribute(objname, "maxActiveSessions"));
System.out.println("会话数:" + mbsc.getAttribute(objname, "activeSessions"));
System.out.println("活动会话数:" + mbsc.getAttribute(objname, "sessionCounter"));
}
//RequestProcessor
ObjectName requestObjName = new ObjectName("Catalina:type=RequestProcessor,*");
Set<ObjectName> requestObjNameSet = mbsc.queryNames(requestObjName, null);
Integer aliveSocketsCount = 0;
Long maxProcessingTime = 0L;
Long processingTime = 0L;
Long requstCount = 0L;
Long errorCount = 0L;
BigDecimal bytesReceived = BigDecimal.ZERO;
BigDecimal bytesSend = BigDecimal.ZERO;
for (ObjectName obj : requestObjNameSet) {
if (mbsc.getAttribute(obj, "stage").toString().trim().equals("1"))
aliveSocketsCount++;
long nowMaxProcessingTime = Long.parseLong(mbsc.getAttribute(obj, "maxTime").toString());
if (maxProcessingTime < nowMaxProcessingTime)
maxProcessingTime = nowMaxProcessingTime;
processingTime += Long.parseLong(mbsc.getAttribute(obj, "processingTime").toString());
requstCount += Long.parseLong(mbsc.getAttribute(obj, "requestCount").toString());
errorCount += Long.parseLong(mbsc.getAttribute(obj, "errorCount").toString());
bytesReceived = bytesReceived.add(new BigDecimal(mbsc.getAttribute(obj, "bytesReceived").toString()));
bytesSend = bytesSend.add(new BigDecimal(mbsc.getAttribute(obj, "bytesSent").toString()));
}
System.out.println("活动sockets计数:"+ aliveSocketsCount.toString());
System.out.println("最大处理时间:"+ maxProcessingTime.toString());
processingTime = processingTime / 1000;
System.out.println("总处理时间:"+ processingTime.toString());
System.out.println("请求总数:"+ requstCount.toString());
System.out.println("错误总数:"+ errorCount.toString());
System.out.println("接收字节数:"+ bytesReceived.divide(new BigDecimal(1024L * 1024))
.setScale(2, RoundingMode.HALF_UP).toPlainString());
System.out.println("发送字节数:"+
bytesSend.divide(new BigDecimal(1024L * 1024)).setScale(2, RoundingMode.HALF_UP).toPlainString());
} catch (Exception e) {
e.printStackTrace();
}
finally
{
if(connector!=null)
{
try {
connector.close();
} catch (IOException e) {
}
}
}
}
public static String formatTimeSpan(long span) {
long minseconds = span % 1000;
span = span / 1000;
long seconds = span % 60;
span = span / 60;
long mins = span % 60;
span = span / 60;
long hours = span % 24;
span = span / 24;
long days = span;
return (new Formatter()).format("%1$d天 %2$02d小时%3$02d分%4$02d秒%5$03d毫秒", days, hours, mins, seconds, minseconds)
.toString();
}
}
5.运行结果
厂商:Oracle Corporation 程序:Java HotSpot(TM) Client VM 版本:24.65-b04 启动时间:2016-06-21 20:57:37 持续工作时间:0天 00小时29分31秒018毫秒 heap:60.11998789417739% nonheap:54.523986450299915% perm gen:165.7018025716146% Users JMImplementation com.sun.management Catalina java.nio java.lang java.util.logging MBeanset.size() : 150 canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=HTMLManager canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=Manager canonicalName : java.lang:type=Memory canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=stock canonicalName : JMImplementation:type=MBeanServerDelegate canonicalName : Catalina:context=/host-manager,host=localhost,name=StandardContextValve,type=Valve canonicalName : Catalina:port=8080,type=Connector canonicalName : Catalina:context=/examples,host=localhost,name=foo/name1,resourcetype=Context,type=Environment canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Tomcat WebSocket (JSR356) Filter canonicalName : Catalina:context=/host-manager,host=localhost,type=WebappClassLoader canonicalName : java.nio:name=mapped,type=BufferPool canonicalName : java.lang:name=MarkSweepCompact,type=GarbageCollector canonicalName : Catalina:context=/manager,host=localhost,name=StandardContextValve,type=Valve canonicalName : Catalina:context=/examples,host=localhost,name=name3,resourcetype=Context,type=Environment canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Filter,name=Tomcat WebSocket (JSR356) Filter canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=default canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Servlet,name=jsp canonicalName : Catalina:host=localhost,name=ErrorReportValve,type=Valve canonicalName : Catalina:context=/host-manager,host=localhost,type=Cache canonicalName : java.lang:name=Tenured Gen,type=MemoryPool canonicalName : Catalina:context=/manager,host=localhost,name=BasicAuthenticator,type=Valve canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Filter,name=Tomcat WebSocket (JSR356) Filter canonicalName : Catalina:type=Engine canonicalName : Catalina:context=/,host=localhost,type=Manager canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=JMXProxy canonicalName : Catalina:context=/docs,host=localhost,type=WebappClassLoader canonicalName : java.lang:name=Code Cache,type=MemoryPool canonicalName : java.util.logging:type=Logging canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,name=jsp,type=JspMonitor canonicalName : Catalina:realmPath=/realm0/realm0,type=Realm canonicalName : Catalina:name=StandardEngineValve,type=Valve canonicalName : Catalina:port=8009,type=ProtocolHandler canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=RequestParamExample canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/ canonicalName : Catalina:context=/manager,host=localhost,type=Manager canonicalName : Catalina:context=/host-manager,host=localhost,name=BasicAuthenticator,type=Valve canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Set Character Encoding canonicalName : Catalina:context=/,host=localhost,type=NamingResources canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Request Dumper Filter canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=ServletToJsp canonicalName : Catalina:name=HttpRequest1,type=RequestProcessor,worker="http-apr-8080" canonicalName : java.lang:type=Compilation canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Filter,name=SetCharacterEncoding canonicalName : java.lang:name=Survivor Space,type=MemoryPool canonicalName : Catalina:port=8080,type=ProtocolHandler canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=ChatServlet canonicalName : Catalina:context=/examples,host=localhost,type=WebappClassLoader canonicalName : Catalina:context=/examples,host=localhost,name=foo/bar/name2,resourcetype=Context,type=Environment canonicalName : Catalina:type=StringCache canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/docs,j2eeType=Filter,name=Tomcat WebSocket (JSR356) Filter canonicalName : java.lang:type=Threading canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=Status canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/manager canonicalName : Catalina:host=localhost,name=StandardHostValve,type=Valve canonicalName : Users:database=UserDatabase,rolename=manager-gui,type=Role canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=default canonicalName : java.lang:name=Perm Gen,type=MemoryPool canonicalName : Catalina:port=8009,type=Mapper canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=wsEchoStream canonicalName : Catalina:context=/docs,host=localhost,type=Loader canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=jsp canonicalName : Catalina:context=/examples,host=localhost,name=FormAuthenticator,type=Valve canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=wsSnake canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Servlet,name=jsp canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Servlet,name=HostManager canonicalName : Catalina:name="http-apr-8080",type=GlobalRequestProcessor canonicalName : Catalina:context=/docs,host=localhost,type=NamingResources canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=jsp canonicalName : java.lang:name=Perm Gen [shared-rw],type=MemoryPool canonicalName : Catalina:context=/,host=localhost,type=Cache canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=wsChat canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=CompressionFilterTestServlet canonicalName : java.lang:name=CodeCacheManager,type=MemoryManager canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Servlet,name=HTMLHostManager canonicalName : Catalina:host=localhost,type=Host canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/docs,j2eeType=Servlet,name=jsp canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=HelloWorldExample canonicalName : Catalina:name=HttpRequest2,type=RequestProcessor,worker="http-apr-8080" canonicalName : Catalina:name="ajp-apr-8009",type=GlobalRequestProcessor canonicalName : java.lang:type=Runtime canonicalName : java.nio:name=direct,type=BufferPool canonicalName : java.lang:name=Copy,type=GarbageCollector canonicalName : Catalina:name=HttpRequest3,type=RequestProcessor,worker="http-apr-8080" canonicalName : Catalina:context=/host-manager,host=localhost,type=Manager canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,name=jsp,type=JspMonitor canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,name=jsp,type=JspMonitor canonicalName : Catalina:host=localhost,name=AccessLogValve,type=Valve canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/examples canonicalName : Catalina:name="ajp-apr-8009",type=ThreadPool canonicalName : Catalina:type=Service canonicalName : com.sun.management:type=HotSpotDiagnostic canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Servlet,name=default canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Filter,name=Tomcat WebSocket (JSR356) Filter canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/docs,j2eeType=Servlet,name=default canonicalName : Catalina:context=/,host=localhost,type=WebappClassLoader canonicalName : java.lang:type=OperatingSystem canonicalName : Catalina:context=/examples,host=localhost,name=StandardContextValve,type=Valve canonicalName : Catalina:type=Server canonicalName : Catalina:port=8009,type=Connector canonicalName : Catalina:name="http-apr-8080",type=ThreadPool canonicalName : Catalina:context=/,host=localhost,name=StandardContextValve,type=Valve canonicalName : Catalina:class=org.apache.catalina.UserDatabase,name="UserDatabase",resourcetype=Global,type=Resource canonicalName : Catalina:context=/manager,host=localhost,type=WebappClassLoader canonicalName : Catalina:context=/examples,host=localhost,type=Manager canonicalName : Catalina:context=/examples,host=localhost,type=Cache canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/host-manager canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/docs canonicalName : Users:database=UserDatabase,type=UserDatabase canonicalName : Catalina:context=/examples,host=localhost,name=foo/name4,resourcetype=Context,type=Environment canonicalName : Catalina:context=/docs,host=localhost,name=StandardContextValve,type=Valve canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Compression Filter canonicalName : Catalina:type=NamingResources canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=SessionExample canonicalName : Catalina:context=/,host=localhost,type=Loader canonicalName : Catalina:name=common,type=ServerClassLoader canonicalName : Catalina:context=/examples,host=localhost,type=Loader canonicalName : Catalina:context=/manager,host=localhost,type=Cache canonicalName : Catalina:context=/docs,host=localhost,type=Cache canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Filter,name=CSRF canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=CookieExample canonicalName : Users:database=UserDatabase,type=User,username="tomcat" canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Filter,name=SetCharacterEncoding canonicalName : Catalina:host=localhost,type=Deployer canonicalName : Catalina:type=MBeanFactory canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=RequestInfoExample canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Timing filter canonicalName : Catalina:context=/examples,host=localhost,type=NamingResources canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Servlet,name=default canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Filter,name=CSRF canonicalName : Catalina:context=/manager,host=localhost,type=Loader canonicalName : Users:database=UserDatabase,type=User,username="admin" canonicalName : Catalina:context=/docs,host=localhost,type=Manager canonicalName : java.lang:name=Eden Space,type=MemoryPool canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=RequestHeaderExample canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/docs,name=jsp,type=JspMonitor canonicalName : java.lang:name=Perm Gen [shared-ro],type=MemoryPool canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,name=jsp,type=JspMonitor canonicalName : Catalina:context=/host-manager,host=localhost,type=NamingResources canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=async2 canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=async3 canonicalName : Catalina:context=/examples,host=localhost,name=minExemptions,resourcetype=Context,type=Environment canonicalName : Catalina:context=/manager,host=localhost,type=NamingResources canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=async0 canonicalName : java.lang:type=ClassLoading canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=async1 canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=wsEchoMessage canonicalName : Catalina:realmPath=/realm0,type=Realm canonicalName : Catalina:context=/host-manager,host=localhost,type=Loader canonicalName : Users:database=UserDatabase,rolename=tomcat,type=Role canonicalName : Catalina:port=8080,type=Mapper 端口名:"ajp-apr-8009" 最大线程数:200 当前线程数:0 繁忙线程数:0 端口名:"http-apr-8080" 最大线程数:200 当前线程数:10 繁忙线程数:0 HTTP最大线程数:200 HTTP当前线程数:10 HTTP繁忙线程数:0 应用名:null 最大会话数:-1 会话数:0 活动会话数:0 应用名:null 最大会话数:-1 会话数:0 活动会话数:0 应用名:null 最大会话数:-1 会话数:0 活动会话数:0 应用名:null 最大会话数:-1 会话数:0 活动会话数:0 应用名:null 最大会话数:-1 会话数:0 活动会话数:0 活动sockets计数:0 最大处理时间:176 总处理时间:0 请求总数:9 错误总数:0 接收字节数:0.00 发送字节数:0.07
微软MVC实现REST风格编程
1、总体来说很简单,首先新建一个MVC框架的项目,模板选择WebAPI,这样就搞定80%了。
2、WebApiConfig.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace UrlToPngWebAPI
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.EnableSystemDiagnosticsTracing();
}
}
}
3、RouteConfig.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace UrlToPngWebAPI
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
4、请求结构
Web2PNGRequest.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Newtonsoft.Json;
namespace UrlToPngWebAPI.Models
{
public class Web2PNGRequest
{
[JsonProperty]
public String WebURL { get; set; }
[JsonProperty]
public String HeaderPath { get; set; }
[JsonProperty]
public String FooterPath { get; set; }
}
}
5、返回结构
Web2PNGResponse.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Newtonsoft.Json;
namespace UrlToPngWebAPI.Models
{
public class Web2PNGResponse
{
[JsonProperty]
public int ErrorCode { get; set; }
[JsonProperty]
public String ErrorInfo { get; set; }
[JsonProperty]
public String PNGPath { get; set; }
}
}
6、Controller
Url2PNGController.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web.Helpers;
using System.Web.Http;
using Newtonsoft.Json;
using UrlToPngCsTest;
using UrlToPngWebAPI.Models;
using UrlToPngWebAPI.Pulgins;
namespace UrlToPngWebAPI.Controllers
{
public class Url2PNGController : ApiController
{
// 返回输入参数示例
public HttpResponseMessage Get()
{
Web2PNGRequest req = new Web2PNGRequest();
req.WebURL = "webURL";
req.HeaderPath = "headerPath";
req.FooterPath = "footerPath";
String jsonString = JsonConvert.SerializeObject(req);
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(jsonString, Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}
// GET
public HttpResponseMessage Get(String WebURL, String HeaderPath, String FooterPath)
{
UrlToPng4Web.InitUrlTOPng4CS();
Web2PNGRequest req = new Web2PNGRequest();
req.WebURL = WebURL;
req.HeaderPath = HeaderPath;
req.FooterPath = FooterPath;
Web2PNGResponse rsp = UrlToPng4Web.UrlToPNG(req);
String jsonString = JsonConvert.SerializeObject(rsp);
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(jsonString, Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}
// POST
public HttpResponseMessage Post(Web2PNGRequest req)
{
UrlToPng4Web.InitUrlTOPng4CS();
Web2PNGResponse rsp = UrlToPng4Web.UrlToPNG(req);
String jsonString = JsonConvert.SerializeObject(rsp);
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(jsonString, Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}
}
}
Jersey实现REST风格编程
首先是服务端:
1、增加服务类
package com.neohope.jessery.test;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
/**
* Created by Hansen
*/
@Path("neotest")
@Produces(MediaType.APPLICATION_JSON)
public class NeoTest {
@GET
@Path("/Add")
public String Add(@QueryParam("a") int a,@QueryParam("b") int b) {
return "{\"c\":" + (a+b) + "}";
}
@GET
@Path("/SayHiTo")
public String sayHiTo(@QueryParam("name") String name) {
return "{\"msg\":\"hi " + name + "\"}";
}
}
2、在web.xml里增加配置
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.neohope.jessery.test</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/Rest/*</url-pattern>
</servlet-mapping>
3、然后是客户端
package com.neohope.jessery.test;
import org.glassfish.jersey.client.ClientConfig;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
/**
* Created by Hansen
*/
public class ClientTest {
public static void main(String[] args) {
ClientConfig clientConfig = new ClientConfig();
Client client = ClientBuilder.newClient(clientConfig);
WebTarget target = client.target("http://localhost:8080/Rest/neotest/" + "Add");
Response response = target.queryParam("a", 1).queryParam("b", 2).request().get();
System.out.println(response.getStatus());
System.out.println(response.readEntity(String.class));
response.close();
WebTarget target1 = client.target("http://localhost:8080/Rest/neotest/" + "SayHiTo");
Response response1 = target1.queryParam("name", "neohope").request().get();
System.out.println(response1.getStatus());
System.out.println(response1.readEntity(String.class));
response1.close();
}
}
WCF自托管服务
一般有两种方式实现:
1、通过代码设置直接实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Text;
using WcfTest;
namespace WcfHosting
{
internal class Program
{
private static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof (SoapService)))
{
host.AddServiceEndpoint(typeof(ISoapService), new WSHttpBinding(), "http://127.0.0.1:1234/neohope");
if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
{
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/neohope/metadata");
host.Description.Behaviors.Add(behavior);
}
host.Opened += delegate
{
Console.WriteLine("service started, press enter to exit.");
};
host.Open();
Console.Read();
}
}
}
}
2、通过配置文件实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Text;
using WcfTest;
namespace WcfHosting
{
internal class Program
{
private static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof (SoapService)))
{
host.Opened += delegate
{
Console.WriteLine("service started, press enter to exit.");
};
host.Open();
Console.Read();
}
}
}
}
app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="metadataBehavior">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:9999/neohope/metadata" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="metadataBehavior" name="WcfTest.SoapService">
<endpoint address="http://127.0.0.9999/neohope" binding="wsHttpBinding"
contract="WcfTest.ISoapService" />
</service>
</services>
</system.serviceModel>
</configuration>
WCF修改SOAP命名空间
有三个地方可以修改SOAP的命名空间:
1、ServiceContract
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Web.Configuration;
namespace WcfTest
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
[ServiceContract(Name="SoapService",Namespace="http://wcftest.neohope.org")]
public interface ISoapService
{
[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "User/Get/{uid}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
NUser GetUser(String uid);
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/User", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
string UpdateUser(NUser newuser);
[OperationContract]
[WebInvoke(Method = "PUT", UriTemplate = "/User", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
string AddUser(NUser newuser);
[OperationContract]
[WebInvoke(Method = "DELETE", UriTemplate = "/User", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
string DeleteUser(String uid);
}
[ServiceBehavior(Name = "SoapService", Namespace = "http://wcftest.neohope.org")]
[DataContract]
public class NUser
{
string uid = "";
string uname = "";
string usex = "";
[DataMember]
public String Uid
{
get { return uid; }
set { uid = value; }
}
[DataMember]
public string UName
{
get { return uname; }
set { uname = value; }
}
[DataMember]
public string USex
{
get { return usex; }
set { usex = value; }
}
}
}
2、服务实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace WcfTest
{
[ServiceBehavior(Name = "SoapService", Namespace = "http://wcftest.neohope.org")]
public class SoapService : ISoapService
{
static List<NUser> users = new List<NUser>();
static SoapService()
{
NUser aNUser = new NUser();
aNUser.Uid = "001";
aNUser.UName = "张三";
aNUser.USex = "男";
users.Add(aNUser);
}
public NUser GetUser(string uid)
{
foreach (NUser nuser in users)
{
if (nuser.Uid == uid)
{
return nuser;
}
}
return null;
}
public string UpdateUser(NUser newuser)
{
if (newuser == null)
{
return "nuewuser is null";
}
foreach (NUser nuser in users)
{
if (nuser.Uid == newuser.Uid)
{
nuser.UName = newuser.UName;
newuser.USex = nuser.USex;
return "User updated";
}
}
return "User not found";
}
public string AddUser(NUser newuser)
{
if (newuser == null)
{
return "nuewuser is null";
}
foreach (NUser nuser in users)
{
if (nuser.Uid == newuser.Uid)
{
nuser.UName = newuser.UName;
newuser.USex = nuser.USex;
return "User updated";
}
}
users.Add(newuser);
return "User added";
}
public string DeleteUser(String uid)
{
bool bFound = false;
for(int i=users.Count-1;i>=0;i--)
{
if (users[i].Uid == uid)
{
bFound = true;
users.RemoveAt(i);
}
}
if (!bFound)
{
return "User Not Found";
}
else
{
return "User Deleted";
}
}
}
}
3、Web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="WcfTest.SoapService">
<endpoint binding="webHttpBinding" contract="WcfTest.ISoapService" bindingNamespace="http://wcftest.neohope.org"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>