问题描述
我正在尝试在 c# 中为 unix 套接字编写一个 DelegateHandler,我觉得我已经掌握了大部分方法,但我不想将所有内容都放在子字符串中以将响应的内容放入实际的 HttpResonseMessage 对象中。我想知道是否有人知道将 http 响应字符串解析为实际对象的快速方法。这就是我现在所拥有的。
namespace unixHttpConverter
{
class UnixHttpMessageHandler : DelegatingHandler
{
private Socket unixSocket;
private readonly object unixSocketLock;
public UnixHttpMessageHandler(string path) {
this.unixSocketLock = new object();
this.unixSocket = new Socket(AddressFamily.Unix,SocketType.Stream,ProtocolType.IP);
unixSocket.ReceiveTimeout = 2000;
unixSocket.Connect(new UnixDomainSocketEndPoint(path));
}
protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,CancellationToken cancellationToken) {
if (request == null){
throw new ArgumentNullException("request");
}
string HTTP_Request = String.Format("{0} {1}{2} HTTP/{3}\r\nHost:{4}:{5}\r\nUser-Agent:{6}\r\n{7}\r\nAccept: */*\r\n\r\n{8}",request.Method.Method,request.RequestUri.PathAndQuery,request.RequestUri.Fragment,request.Version.ToString(),request.RequestUri.Host,request.RequestUri.Port,"C#",request.Content.Headers.ToString().Trim(),request.Content.ReadAsstringAsync().Result
);
byte[] request_bytes = Encoding.ASCII.GetBytes(HTTP_Request);
return await Task<HttpResponseMessage>.Run(() => sendViaSocket(request_bytes),cancellationToken);
}
private HttpResponseMessage sendViaSocket(byte[] request_bytes) {
List<byte> bytes = new List<byte>();
lock(unixSocketLock)
{
unixSocket.Send(request_bytes);
byte[] recvBytes = new byte[1024];
int numBytes = 0;
do
{
numBytes = unixSocket.Receive(recvBytes,1024,SocketFlags.None);
bytes.AddRange(recvBytes);
} while (numBytes == 1024);
unixSocket.disconnect(true);
}
//if not equal to 1024 then we have collected all bytes
string str_result = Encoding.ASCII.GetString(bytes.ToArray());
HttpResponseMessage result = new HttpResponseMessage();
// 012345678ABCDEF
// HTTP/1.1 200 OK
result.StatusCode = (HttpStatusCode)Enum.Parse(typeof(HttpStatusCode),str_result.Substring(10,3));
return null;
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)