ErisX 2017-05-16 09:41 采纳率: 100%
浏览 998
已采纳

Web Service中在 SOAP扩展类 中处理Request/Response

(C#/.net 新手)在做一Web Service, 过程是用SOAP协议,我要做的是解析 Client 端发过来的 POST/GET的 XML流, 完了产生一个XML流返回给Client

查了下,需要用到SOAP扩展重写SoapExtension和SoapExtensionAttribute去做,但是有个问题是目前不太了解重新建立的XML流如何交给返回的数据流

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


  • 写回答

1条回答 默认 最新

  • ErisX 2017-05-18 06:47
    关注

    方法:
    在序列化之后进行xml的改写

     public void WriteOutput(SoapMessage message)// AfterSerialize后,服务器返回xml数据,_oldStream为空,改写_newStream
            {
                FileStream fs;
                StreamWriter w = null; 
    
                try
                {
                    if (_logTypeMode.Equals(LogType.RequestOnly) || _logTypeMode.Equals(LogType.RequestReponse))
                    {
                        _newStream.Position = 0;
                        // 改掉_newStream的内容
                        fs = new FileStream(_reqFilename, FileMode.Append, FileAccess.Write);
                        w = new StreamWriter(fs);
                        try { 
                            StringBuilder sb = new StringBuilder();
                            sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
                            sb.Append("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">");
                            sb.Append("<soap:Body>");
                            sb.Append("<HelloWorldResponse xmlns=\"http://tempuri.org/\">");
                            sb.Append("<HelloWorldResult>Hello World Service 1234567 - ````````222222222</HelloWorldResult>");
                            sb.Append("</HelloWorldResponse>");
                            sb.Append("</soap:Body>");
                            sb.Append("</soap:Envelope>");
    
                            byte[] strBytes = Encoding.ASCII.GetBytes(sb.ToString());
    
                            Copy(new MemoryStream(strBytes), _newStream);
                        }catch(Exception ex){
                            w.WriteLine("Error Writting");
                            w.Flush();
                        }
    
    
                        _newStream.Position = 0;
                        string soapString = "Server-SoapResponse";
                        w.WriteLine("-----" + soapString + " at 11111xOutput _newStream" + DateTime.Now);
                        w.Flush();
                        Copy(_newStream, fs);
    
                        w.Close();
    
                    }
                }
                catch (Exception ex)
                {
                }
                finally
                {
                    if (w != null) w.Close();
                    _newStream.Position = 0;
                    Copy(_newStream, _oldStream);
    
                }
            }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试