朋友说开发电信的MMS,其实需要图片作为附件放在调用WebService接口上,使用Http的Content-Type: Multipart/Related;来发送,真让人感觉不伦不类的。不知道为什么不设计成一个字段是BASE64编码得了呗。

难道只能用朋友说的拼字段的方法了不? 我用Reflect分析了一下,貌似这样也可以实现。

我们知道,我们添加一个WebService引用时,会自动生成从  SoapHttpClientProtocol 的子类。我的想法是,我们写一个 继承自"SoapHttpClientProtocol” 的子类SoapHttpClientProtocolEX, 重写方法:GetWebRequest() 返回我们写的代码 HttpWebRequestEx类,然后在原始 HttpWebRequest 类的GetRequestStream()时,返回我们的流转移器:NetwordStreamEx ,并在方法关闭流 Close() 前,加入自定义的附件信息。

不知道说清楚没有, 这里列了部分代码框架:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Services.Protocols;
using System.Net;
using System.Net.Sockets;
using System.IO;namespace Foundway.Util.WebService
{public class SoapHttpClientProtocolEx : SoapHttpClientProtocol{private List<string> attachments = new List<string>();/// <summary>/// 添加一个附件/// </summary>/// <param name="attachment">附件全路径</param>public void AddAttachment(string attachment){attachments.Add(attachment);}protected override  WebRequest GetWebRequest(Uri uri){WebRequest request =   base.GetWebRequest(uri);if (attachments.Count > 0){HttpWebRequest httpRequest = request as HttpWebRequest;if (httpRequest != null){httpRequest.SendChunked = true; //使用多段发送HttpWebRequestEx httpRequestEx = new HttpWebRequestEx(httpRequest, attachments.ToArray());return httpRequestEx;}}return request;}}public class HttpWebRequestEx : WebRequest{private string[] attachments;private HttpWebRequest httpRequest = null;public HttpWebRequestEx(HttpWebRequest httpRequest, string[] attachments){this.httpRequest = httpRequest;this.attachments = attachments;}public override System.IO.Stream GetRequestStream(){Stream stream = httpRequest.GetRequestStream();//返回自定义的流代理,来完成附件的信息return new NetworkStreamEx(stream, this.attachments);}#region 重写其它全部公共方法public override void Abort(){httpRequest.Abort();}public override IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state){return httpRequest.BeginGetRequestStream(callback, state);}public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state){return httpRequest.BeginGetResponse(callback, state);}public override System.Net.Cache.RequestCachePolicy CachePolicy{get{return httpRequest.CachePolicy;}set{httpRequest.CachePolicy = value;}}public override string ConnectionGroupName{get{return httpRequest.ConnectionGroupName;}set{httpRequest.ConnectionGroupName = value;}}public override long ContentLength{get{return httpRequest.ContentLength;}set{httpRequest.ContentLength = value;}}public override string ContentType{get{return httpRequest.ContentType;}set{httpRequest.ContentType = value;}}public override System.Runtime.Remoting.ObjRef CreateObjRef(Type requestedType){return httpRequest.CreateObjRef(requestedType);}public override ICredentials Credentials{get{return httpRequest.Credentials;}set{httpRequest.Credentials = value;}}public override Stream EndGetRequestStream(IAsyncResult asyncResult){return httpRequest.EndGetRequestStream(asyncResult);}public override WebResponse EndGetResponse(IAsyncResult asyncResult){return httpRequest.EndGetResponse(asyncResult);}public override WebResponse GetResponse(){return httpRequest.GetResponse();}public override WebHeaderCollection Headers{get{return httpRequest.Headers;}set{httpRequest.Headers = value;}}public override string Method{get{return httpRequest.Method;}set{httpRequest.Method = value;}}public override bool PreAuthenticate{get{return httpRequest.PreAuthenticate;}set{httpRequest.PreAuthenticate = value;}}public override IWebProxy Proxy{get{return httpRequest.Proxy;}set{httpRequest.Proxy = value;}}public override object InitializeLifetimeService(){return httpRequest.InitializeLifetimeService();}public override Uri RequestUri{get{return httpRequest.RequestUri;}}public override int Timeout{get{return httpRequest.Timeout;}set{httpRequest.Timeout = value;}}public override string ToString(){return httpRequest.ToString();}public override bool UseDefaultCredentials{get{return httpRequest.UseDefaultCredentials;}set{httpRequest.UseDefaultCredentials = value;}}public override bool Equals(object obj){return httpRequest.Equals(obj);}public override int GetHashCode(){return httpRequest.GetHashCode();}#endregion}public class NetworkStreamEx :Stream{private string[] attachments;private Stream baseStream;public NetworkStreamEx(Stream baseStream, string[] attachments){this.baseStream = baseStream;}/// <summary>/// 在关闭时,加入附件信息/// </summary>public override void Close(){///TODO:这里添加附件信息,///这里就不加代码了///base.Close();}#region 把其它公共方法转发到原流public override bool CanRead{get { return baseStream.CanRead; }}public override bool CanSeek{get { return baseStream.CanSeek; }}public override bool CanWrite{get { return baseStream.CanWrite; }}public override void Flush(){baseStream.Flush();}public override long Length{get { return baseStream.Length; }}public override long Position{get{return baseStream.Position;}set{baseStream.Position  = value;}}public override int Read(byte[] buffer, int offset, int count){return baseStream.Read(buffer, offset, count);}public override long Seek(long offset, SeekOrigin origin){return baseStream.Seek(offset, origin);}public override void SetLength(long value){baseStream.SetLength(value);}public override void Write(byte[] buffer, int offset, int count){baseStream.Write(buffer, offset, count);}#endregion}}
引自:51aspx

转载于:https://www.cnblogs.com/evlon/archive/2009/12/27/1633688.html

使用C#调用Java带MIME附件WebService方法的初步设想相关推荐

  1. 解决onclick事件调用其它带参数的函数方法无效的问题

    不解以下现象: 原始版本代码:可跳过代码直接看解决方案部分.前面的文字是在解决问题时的思考. <body> <div id="div1"><form ...

  2. c调用java jar_C#调用java类、jar包方法。

    一.将已经编译后的java中Class文件进行打包:打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理: 使用的命令:jar cvf test.jar -C com/ . 其中tes ...

  3. java方法中与参数怎么调用,java中怎么从一个方法中调用另一个方法中的参数?(以及如何提取数字)...

    一.使用动态方法 public int comparisonOfTotalVehicles (WebDriver webDriver)throws InterruptedException{ WebE ...

  4. java runnable 使用_如何调用java Runnable对象的其他方法?

    任何编程语言中的任何方法都在与调用者相同的线程中执行.当你调用Thread.start()时,它会在调用它的同一个线程中运行. 现在,您知道Thread的run()方法不会在与start相同的线程中执 ...

  5. JNI基础 c语言调用java方法

    利用c语言调用java无参的方法 java方法 com.example.jniparsedata.ParseData类中的方法     //打印     public void sayHelloFro ...

  6. 【Kotlin】apply 内联扩展函数 ( apply 函数原型 | apply 函数示例 | Kotlin 调用 Java API )

    文章目录 I . 内联扩展函数 apply II . Kotlin 调用 Java API III . apply 内联扩展函数示例 ( 调用 Java API 处理图像 ) I . 内联扩展函数 a ...

  7. PHP中调用Java类的两个办法

    Java语言功能强大,因此在许多情况下在php中来调用Java的功能将十分有用.在php中调用Java语言有两种方法,一种是使用php中的Java扩展模块,另一种是使用minij2ee应用服务器提供的 ...

  8. 比较两种php调用Java对象的方法

    Java语言功能强大,因此在许多情况下在php中来调用Java的功能将十分有用.在php中调用Java语言有两种方法,一种是使用php中 的Java扩展模块,另一种是使用minij2ee应用服务器提供 ...

  9. Kotlin学习笔记 第四章Kotlin调用Java

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

最新文章

  1. Python Socket 编程——聊天室示例程序
  2. 【数据结构与算法】之深入解析“单词接龙II”的求解思路与算法示例
  3. Spring集成–配置Web服务客户端超时
  4. matlab怎么打出角频率,[Matlab]频率f,角频率Ω和数字频率w的物理含义
  5. SpringBoot实战(十六):集成Skywalking调用链监控系统
  6. 为什么不可以使用哈曼顿距离_声光色影俱佳,美也要与众不同,哈曼卡顿无线水晶4评测...
  7. vue3.0 组件篇 Card
  8. Scrapy框架爬取新闻!
  9. 修复XP图片和传真查看器!
  10. php搜索银行所在支行,多家银行宣布启动社区支行战略但风光不再
  11. BT种子/磁力/eD2K,P2P和各种下载协议
  12. j3455安装linux 4k驱动,nas-j3455kvm安装win10及集成显卡直通
  13. 引擎选择:GameMaker
  14. matlab5.白噪声检验
  15. iOS 开发者账号续费后打印发票
  16. vs2010出现“请确保已安装Microsoft SQL Server Compact 3.5,并且没有其它应用程序正在访问该文件 ”
  17. 浅谈Spring IOC的理解
  18. 就业两年国企辞职考研经验心得
  19. EViews对数据进行调整(取对数)
  20. 让我们一起来书写人生

热门文章

  1. Python字符串index()
  2. java 异常面试问题_Java异常面试问答
  3. lshw linux_Linux lshw命令–获取Linux硬件信息
  4. jquery 图像滑块_jQuery缩略图图像滑块– CSS,JavaScript
  5. cv::cornerSubPix()亚像素角点检测
  6. 完整的微服务系统应该包括哪些功能?
  7. 港媒:中国将斥资1800亿美元建全球最大5G网络
  8. Spring MVC 解读——context:component-scan/
  9. 【廖雪峰官方网站/Java教程】多线程(2)
  10. 【To Do!】程序员面试金典——18.8子串判断