我正在使用以下代码来获取JAX-WS单向方法调用的客户端IP地址:
protected HttpServletRequest getServletRequest() {
MessageContext ctx = wsContext.getMessageContext();
return (HttpServletRequest) ctx.get( MessageContext.SERVLET_REQUEST );
}
protected synchronized String getClientIp() {
String clientIp = "";
HttpServletRequest request = getServletRequest();
if ( request != null ) {
clientIp = request.getRemoteAddr();
// Handle proxy
String header = request.getHeader( "x-forwarded-for" );
if( header != null && !header.isEmpty() ) {
clientIp = header.split( "," )[0];
}
}
return clientIp;
}
Run Code Online (Sandbox Code Playgroud)
当多个客户端连接时,为请求检索的IP地址有时是来自先前请求的不正确的缓存值.获取单向呼叫始发者IP地址的可靠方法是什么?
我有一个场景,我的C#类有两个方法说,DoThis()并且DoThat()由外部调用者以任何顺序相互独立调用.这两种方法需要以下列方式同步:
DoThis(),至少等待t1几秒钟才能继续DoThat()执行DoThat(),至少等待t2几秒钟才能继续DoThis()执行所以基本上是伪代码:
static SomeCustomTimer Ta, Tb;
static TimeSpan t1, t2;
public static void DoThis()
{
if(Tb.IsRunning())
Tb.WaitForExpiry();
DoStuff();
Ta.Start(t1);
}
public static void DoThat()
{
if(Ta.IsRunning())
Ta.WaitForExpiry();
DoOtherStuff();
Tb.Start(t2);
}
Run Code Online (Sandbox Code Playgroud)
DoStuff()而DoOtherStuff()在不长时间运行的方法,不以其他方式共享资源.通常DoThis()并DoThat()不会同时调用.但我仍然需要防止潜在的僵局.
我怎样才能最好地实现DoThis(),DoThat()在C#中?
编辑 我的场景现在很简单,因为没有任意数量的线程调用这些函数.出于简化的目的,有一个调用程序线程以任意顺序调用这些函数.因此,不会同时调用这两个方法,而是调用者将以任何顺序逐个调用这些方法.我无法控制调用者线程的代码,所以我想强制执行连续调用DoThis(),DoThat()之间的延迟.