cxf webservice服务端怎么能获取客户端发送的soap请求信息

cxf webservice服务端怎么能获取客户端发送的soap请求信息,第1张

net做的webservice都是假定对方按套路给自己发包,遇到电信网关那种不安标准发包的,就会报错。当然解决办法还是有的,这需要设置方法的属性。

下面的代码是我调电信接口时调通的,如果不能用,那就抓包看对方发的是什么样子的包,对症设置属性

[WebService(Namespace = ">

Service 服务有两种方式启动,1, startService() 方法启动,2,bindService() 方法绑定

bindService() 方法,返回一个 Binder,负责和 Service 通信。

多次执行 bindService() 绑定方法,onCreate() 和 onBind() 方法只执行一次。

可以同时使用两个启动方法,例如,先 startService() 方法启动服务,执行生命周期方法,onCreate() 和 onStartCommand() 方法,再绑定,onBind() 方法。

解除绑定 onUnBind(),停止服务,onDestroy() 方法。

ContextWrapper 装饰者类 bindService() 方法,委托内部 ContextImpl 类 bindService() 方法。

bindServiceCommon() 方法,访问 Ams 服务。

sd 是 IServiceConnection 对象,系统为 Ams 服务设定的入参,跨进程通信 (不是 ServiceConnection),回调 App, 在 IServiceConnectionaidl 文件中定义。

Ams 服务 bindService() 方法。

LoadedApk 类 getServiceDispatcher() 方法,获取 IServiceConnection。

LoadedApk 类 内部保存 ServiceConnection 和 ServiceDispatcher ( LoadedApk 内部类)的 ArrayMap。

InnerConnection 类,继承 IServiceConnectionStub,持 ServiceDispatcher 弱引用。

Binder 类型,Ams 服务回调 App 的实现类,进程间通信的服务端,IServiceConnection 业务实现,实现方法是 connected() 。

在 Ams 服务中,涉及相关类是 ActivityManagerService 和 ActiveServices 类。

在 realStartServiceLocked() 方法,通过 IApplicationThread 代理,回调 App 进程 scheduleCreateService() 方法,生命周期方法 onCreate()。

在 requestServiceBindingLocked() 方法,回调 App 进程 scheduleBindService() 方法,执行 Service 的 onBind() 和 ServiceConnection 类 onServiceConnected() 方法。

1,生命周期 onCreate() 方法 和 Service 启动流程一样。

2,scheduleBindService() 方法,向主线程发送消息,执行 handleBindService() 方法,(H 类处理 BIND_SERVICE 消息)

根据 token 查找已创建的 Service 对象,执行 Service 类 onBind() 方法,返回 IBinder 对象(+业务类型),Service 类服务端实现业务接口。

publishService() 方法,发布 IBinder 到 Ams,再通过 IServiceConnection 代理通知客户端。

ConnectionRecord 内部 conn,InnerConnection 类型,Ams 服务通过它访问 App 进程,调用 InnerConnection 的 connected() 方法,将 Binder 返回。

内部弱引用 ServiceDispatcher 的 connected() 方法,

ServiceDispatcher 构造方法传入 Handler,即从 ActivityThread 获取的 H 类。

RunConnection 任务,执行 doConnected() 方法。

执行 ServiceDispatcher 内部 ServiceConnection 的 onServiceConnected() 方法,用户自己实现。

只有onBind() 返回 Binder 不空时,才会调用 onServiceConnected() 方法。

ActivityManagergetService() 方法,客户端 ActivityManagerService 代理,执行 Ams 服务 bindService() 方法。

委托给 Ams 内部的 ActiveServices 类,以下都是该类的方法。

调用 bringUpServiceLocked() 方法。

调用 realStartServiceLocked() 方法,通过 scheduleCreateService() 方法回调 App 进程,创建 Service,生命周期 onCreate() 方法,然后,设置 created 标志,再执行 requestServiceBindingLocked() 方法,它回调 App 进程的 scheduleBindService() 方法,回传参数 IBinder ( Ams 的 ServiceRecord 记录),在 App 进程,发送 BIND_SERVICE 绑定消息到 ActivityThread 的 H 处理。

注意,sendServiceArgsLocked() 方法,用于回调 App,执行 onStartCommand() 方法,但需要 ServiceRecord 有 startRequested 标志,以及 pendingStart 列表不空,显然,即使多次 bindService(),上面走进了 sendServiceArgsLocked() 方法,也不会去执行 onStartCommand()。

向 Ams 服务注册绑定的服务类,通过 ApplicationThread 类实现 App 通知。

如果服务未创建,首先通知 App 生成服务实例, 生命周期 onCreate() 方法。

多次 bindService() 时,onCreate() 和 onBind() 只执行一次。

服务绑定成功,将 Binder 发布到 Ams 服务,Ams 再利用 IServiceConnection 业务接口跨进程将服务已经连接的消息通知在 Activity 中自定义的服务连接对象 ServiceConnection,返回它 Binder。

任重而道远

注意事项:

在Spring Boot中,如果我们要获取当前Request实例,可以通过以下这个方法获取。

使用这种方法获取的时候需要注意使用多线程会出现些状况,例如一个请求过来后,请求达到Service方法,然后Service方法里另起一个线程启动,在该线程run方法里面想要通过以上方法可能获取不到Request实例。

且看RequestContextHolder内部分源码:

可看到之所以能通过静态方法getRequestAttributes获取Request实例,是因为ThreadLocal获取。一个请求到达容器后,Spring会把该请求Request实例通过setRequestAttributes方法 把Request实例放入该请求线程内ThreadLocalMap中,然后就可以通过静态方法取到。原理就是ThreadLocal,但ThreadLocal不能让子线程继承ThreadLocalMap信息,可以使用 InherbritableThreadLocal 实现子线程信息传递。

但Spring Boot 默认使用ThreadLocal把Request设置进请求线程中,这样如果在请求方法里面另起一个子线程然后再通过getRequestAttributes方法获取,是获取不到的。

所以要在能让子线程获取到,就可以使用InherbritableThreadLocal,看setRequestAttributes方法有这个布尔值可以设,至于在哪里设就没去深究。但个人认为最好不要修改该布尔值,默认就行,否则会有意向不到的可能

>

import orgapachestruts2ServletActionContext;

ServletActionContextgetRequest();

这是struts2获取request的方法,

你这框架里 应该也有这种类似的对象ServletActionContext

如果没有 就用this 查看下

还没有 就去看配置里 配置里应该有

request 的其他功能,request 是一个域对象,request 对象也是一个存储数据的区域对象,所以也具有如下方法:setAttribute(String name, Object o),getAttribute(String name),removeAttribute(String name)

request 完成请求转发,获得请求转发器----path 是转发的地址RequestDispatchegetRequestDispatcher(String path),通过转发器对象转发requestDispathcerforward(ServletRequest request, ServletResponse response)

>

service 方法中的 request 的类型是 ServletRequest,而 doGet/doPost 方法的request 的类型是 >

通过 request 获得请求行,获得客户端的请求方式:String getMethod()

获得请求的资源:String getRequestURI(),StringBuffer getRequestURL(),String getContextPath(),String getQueryString(),requestgetRemoteAddr()

通过 request 获得请求头,long getDateHeader(String name),String getHeader(String name),Enumeration getHeaderNames(),Enumeration getHeaders(String name),int getIntHeader(String name),这里只展示最常用的两种方法~

通过 request 获得请求体,请求体中的内容是通过 post 提交的请求参数,通过一下方法获得请求参数:String getParameter(String name),String[] getParameterValues(String name),Enumeration getParameterNames(),Map<String,String[]> getParameterMap()

注意:get 请求方式的请求参数 上述的方法一样可以获得

[ServiceContract()]

public interface IMyService

{

[OperationContract]

[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyleBare, UriTemplate = "user/avatar")]

void UploadUserAvatar(Stream ins);

}

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsModeAllowed)]

public class MyService : IMyService

{

public void UploadUserAvatar(Stream ins)

{

// 将保存至1png

using (FileStream fs = new FileStream("C:\1png", FileModeOpenOrCreate, FileAccessWrite))

{

BinaryReader reader = new BinaryReader(ins);

byte[] buffer;

BinaryWriter writer = new BinaryWriter(fs);

long offset = fsLength;

long len = 0;

writerSeek((int)offset, SeekOriginBegin);

do

{

len += 1024;

buffer = readerReadBytes(1024);

writerWrite(buffer);

} while (bufferLength > 0);

fsClose();

readerDispose();

writerDispose();

}

}

}

以上就是关于cxf webservice服务端怎么能获取客户端发送的soap请求信息全部的内容,包括:cxf webservice服务端怎么能获取客户端发送的soap请求信息、asp.net 开发: webservice 如何获取调用者的IP和 dns (需要代码,谢谢!)、Service 绑定流程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9561046.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存