惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google Online Security Blog
Google Online Security Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
C
Cybersecurity and Infrastructure Security Agency CISA
Cisco Talos Blog
Cisco Talos Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Scott Helme
Scott Helme
Project Zero
Project Zero
E
Exploit-DB.com RSS Feed
S
Secure Thoughts
K
Kaspersky official blog
L
Lohrmann on Cybersecurity
NISL@THU
NISL@THU
WordPress大学
WordPress大学
N
News and Events Feed by Topic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LINUX DO - 热门话题
小众软件
小众软件
P
Privacy & Cybersecurity Law Blog
博客园 - 聂微东
Google DeepMind News
Google DeepMind News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
A
About on SuperTechFans
Hacker News: Ask HN
Hacker News: Ask HN
AWS News Blog
AWS News Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Hacker News: Front Page
F
Full Disclosure
Latest news
Latest news
Schneier on Security
Schneier on Security
The Hacker News
The Hacker News
T
Troy Hunt's Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Jina AI
Jina AI
Martin Fowler
Martin Fowler
P
Proofpoint News Feed
TaoSecurity Blog
TaoSecurity Blog
G
GRAHAM CLULEY
Forbes - Security
Forbes - Security
V
V2EX - 技术
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Vulnerabilities – Threatpost
C
Cyber Attacks, Cyber Crime and Cyber Security
MongoDB | Blog
MongoDB | Blog
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
Hugging Face - Blog
Hugging Face - Blog
P
Privacy International News Feed
C
Check Point Blog
N
News and Events Feed by Topic

博客园 - point.deng

Pinax安装笔记 CuteEditor使用心得 asp.net 中的default button 悬浮的购物车 - point.deng - 博客园 DIV+CSS实现圆角 欢迎使用我的控件 有用的SQL语句,更新中~ asp.net 实现多语言界面 同一账号多次登录 WEB自定义控件小记 C# 使用HOOK 小记 视频转为flv和图片 Asp.net上传图片产生预览效果(转) asp.net2.0用户和角色管理 javascript 练习 Ajax示例 asp.net开发小技巧 Master Page主题以及皮肤的使用 ASP.NET 2.0网站快速导航
关于WebService中SOAP扩展求助~~ - point.deng - 博客园
point.deng · 2008-03-28 · via 博客园 - point.deng

最近整了个WebService的SOAP扩展,遇到了问题,网上找了很久,没找到一个好的方法。想到园子里肯定高手如云,特来此求助~!
情况是这样的:
我有一个WebService,在没加SOAP扩展前是可以访问的。代码如下:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
//[Serializable]
public class UsersDAL : System.Web.Services.WebService
{
    
public UsersDAL() { }
    
//private static UserDataAccess access = new UserDataAccess();
    private static DataAccess.UserDataAccess access = new DataAccess.UserDataAccess();

    [WebMethod, MySoap]
    
public void Create(DataAccess.Users user)
    
{
        access.Create(user);
    }


    [WebMethod, MySoap]
    
public DataAccess.Users Get(int id)
    
{
        
return access.Get(id);
    }


    [WebMethod, MySoap]
    
public List<DataAccess.Users> GetAll()
    
{
        
return access.GetAllUsers();
    }


    [WebMethod, MySoap]
    
public string Hello(string name)
    
{
        
return "Hello:" + name;
    }

}

后来通过学习,想到通过SOAP扩展来加密消息,于是:

public class MySoap : SoapExtension
{
    
public override object GetInitializer(Type serviceType)
    
{
        
return GetType();
    }


    
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
    
{
        
return null;
    }


    
public override void Initialize(object initializer)
    
{
        
//throw new Exception("The method or operation is not implemented.");
    }


    
public override void ProcessMessage(SoapMessage message)
    
{
        
switch (message.Stage)
        
{
            
case SoapMessageStage.BeforeSerialize:
                
break;
            
case SoapMessageStage.AfterSerialize:
                Print(message);
                
break;
            
case SoapMessageStage.BeforeDeserialize:
                Print(message);
                
break;
            
case SoapMessageStage.AfterDeserialize:
                
break;
            
default:
                
throw new Exception("invalid stage");
        }

    }


    
public override Stream ChainStream(Stream stream)
    
{
        
return base.ChainStream(stream);
    }


    
void Print(SoapMessage message)
    
{
        
if (message.Stream.CanRead)
        
{
            StreamReader reader 
= new StreamReader(message.Stream);
            
string xml = reader.ReadToEnd();

            
//FileStream fs = new FileStream("C:\\log.txt", FileMode.Append, FileAccess.Write);
            FileStream fs = new FileStream("C:\\log.txt", FileMode.Append, FileAccess.Write);
            StreamWriter w 
= new StreamWriter(fs);
            w.WriteLine(message.Stage.ToString() 
+ "\r\n" + message.MethodInfo.Name + "\r\n" + xml);
            w.Close();
            fs.Close();
        }

    }

}



public class MySoapAttribute : SoapExtensionAttribute
{
    
public override Type ExtensionType
    
{
        
get return typeof(MySoap); }
    }


    
private int priority = 1;
    
public override int Priority
    
{
        
get return priority; }
        
set { priority = value; }
    }

}

这里在序列化之后和反序列化之前都输出一次当前流中的数据,但是第次都会出错,当我在客户端调用方法时,总会弹出个对话框:

并且日志文件里输出的是:
BeforeDeserialize
GetAll
还有XML头,
没搞明白是怎么回事,
当:

public override void ProcessMessage(SoapMessage message)
    
{
        
switch (message.Stage)
        
{
            
case SoapMessageStage.BeforeSerialize:
                
break;
            
case SoapMessageStage.AfterSerialize:
                
//Print(message);
                break;
            
case SoapMessageStage.BeforeDeserialize:
                
//Print(message);
                break;
            
case SoapMessageStage.AfterDeserialize:
                
break;
            
default:
                
throw new Exception("invalid stage");
        }

    }

这样的时候,肯定是正确的,当然日志也没有输出。

我这样做的目的是想看一下每回那个流到底是什么样子(我想应该是XML吧~),然好想个办法加密一下这个流。
但是我像上面那样输出流应该没什么问题吧,为什么出错呢~
我再改了一下:

 public override void ProcessMessage(SoapMessage message)
    
{
        
switch (message.Stage)
        
{
            
case SoapMessageStage.BeforeSerialize:
                
break;
            
case SoapMessageStage.AfterSerialize:
                Print(message);
                
break;
            
case SoapMessageStage.BeforeDeserialize:
                
//Print(message);
                break;
            
case SoapMessageStage.AfterDeserialize:
                
break;
            
default:
                
throw new Exception("invalid stage");
        }

    }

这样的时候,数据可以正确访问,但是没日志输出。表示在充列化之后流是不可读的~~那如果这里不行的话,加密应该在那里进行呢?

请各位高手指点一下,这个问题困扰很久啦~~~