/// <summary>
/// It calls the native method EcDoDisconnect that closes a Session Context with the server.
/// The Session Context is destroyed and all associated server state, objects, and resources that are associated with the Session Context are released.
/// </summary>
/// <param name="cxh">On input, contains the CXH of the Session Context that the client wants to disconnect.
/// On output, the server MUST clear the CXH to a zero value.</param>
/// <returns>If the method succeeds, the return value is 0. If the method fails, the return value is an implementation-specific error code.</returns>
public uint Disconnect(ref IntPtr cxh)
{
try
{
uint returnValue = NativeMethods.EcDoDisconnect(ref cxh);
if (this.bindingHandle != IntPtr.Zero)
{
bool rpcForceShutdownAssociation = bool.Parse(Common.GetConfigurationPropertyValue("RpcForceShutdownAssociation", this.site));
if (rpcForceShutdownAssociation)
{
uint status = NativeMethods.RpcBindingSetOption(this.bindingHandle, 13, 1); // 13 represents RPC_C_OPT_DONT_LINGER option
if (status != 0)
{
this.site.Assert.Fail("Failed to set option on the binding handle, the RpcBindingSetOption method returned status code: {0}", status);
}
}
NativeMethods.RpcBindingFree(ref this.bindingHandle);
this.bindingHandle = IntPtr.Zero;
}
return(returnValue);
}
catch (SEHException e)
{
this.site.Log.Add(LogEntryKind.Comment, "EcDoDisconnect throws exception, system error code is {0}, the error message is: {1}", RpcExceptionCode(e), (new Win32Exception((int)RpcExceptionCode(e))).ToString());
// The exception in ECDoDisconnect should be ignored here.
return(0);
}
}