I’ve recently moved this blog to an OpenLiteSpeed server, currently running version 1.6.19. I could not get my trusty Windows Live Writer to connect and upload a blog post—even after allowing XMLRPC from my IP address.
Every time I tried to publish a post, I got this stack trace in %LocalAppData%\Windows Live Writer\Windows Live Writer.log:
WindowsLiveWriter,14.23684,None,00074,29-Jan-2021 10:39:04.516,"== BEGIN WebException =====================","" WindowsLiveWriter,14.23684,None,00075,29-Jan-2021 10:39:04.516,"Status: SendFailure","" WindowsLiveWriter,14.23684,None,00076,29-Jan-2021 10:39:04.517,"System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send. ---> System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream. at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count) at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) at System.Net.TlsStream.CallProcessAuthentication(Object state) at System.Threading.ExecutionContext.runTryCode(Object userData) at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result) at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size) at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size) at System.Net.ConnectStream.WriteHeaders(Boolean async) --- End of inner exception stack trace --- at System.Net.HttpWebRequest.GetResponse() at WindowsLive.Writer.CoreServices.HttpRequestHelper.SendRequest(String requestUri, HttpRequestFilter filter) at WindowsLive.Writer.CoreServices.XmlRpcClient.CallMethod(String methodName, XmlRpcValue[] parameters) at WindowsLive.Writer.BlogClient.Clients.XmlRpcBlogClient.CallMethod(String methodName, XmlRpcValue[] parameters)","" WindowsLiveWriter,14.23684,None,00077,29-Jan-2021 10:39:04.517,"== END WebException =======================",""
The key phrase is “The underlying connection was closed: An unexpected error occurred on a send.”
Even after turning on LiteSpeed debug logging, I could not see the request hitting the server. I installed Fiddler Everywhere; it only showed a couple of 200 OK connection to the web root, no other communication.
Finally I came across this post that mentions as an aside, “If you want to use the older Windows Live Writer, you will need to ensure your website allows for TLS 1.0 (Rather than the usual minimum TLS 1.2).” Well, the OpenLiteSpeed virtual host does in fact disable TLS 1.0 and 1.1 by default, but even after temporarily enabling those versions, I got the same error in Windows Live Writer.
I decided to try Open Live Writer, an open-source replacement for Windows Live Writer. Oddly, after downloading and running the installer, I was taken to a Windows Store app—already installed? The good news is that I was immediately able to set up my blog, connecting and publishing to OpenLiteSpeed without further trouble.
See this post for some notes on setting up Open Live Writer plugins now that it installs as a Windows app.