wcf纯代码实现http服务
数据结构
public enum AgvUpgradeStep { VersionCheck = 0, Downloading = 1, Updating = 2, Booting = 3 } public enum AgvUpgradeResult { Success = 0, Running = 1, Failed = 2 } [DataContract] public class AgvUpgradeProgress { [DataMember] public AgvUpgradeStep step; [DataMember] public AgvUpgradeResult status; [DataMember] public string errinfo; }
1 定义协定
[ServiceContract] public interface TestHttpInterface { [OperationContract] [WebGet(UriTemplate = "DownloadFile")] //DownloadFile?Path={path} Stream DownloadFile(); [WebInvoke(Method = "POST", UriTemplate = "TestJson", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)] [OperationContract] Stream TestJson(AgvUpgradeProgress progress); }
2 实现协定
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class TestHttpService : TestHttpInterface { public string upgradeFile; public Stream DownloadFile() { if (WebOperationContext.Current == null) throw new Exception("WebOperationContext not set"); if (string.IsNullOrEmpty(upgradeFile)) { return null; } if (File.Exists(upgradeFile) == false) { return null; } var fileName = Path.GetFileName(upgradeFile); WebOperationContext.Current.OutgoingResponse.ContentType = "application/octet-stream"; WebOperationContext.Current.OutgoingResponse.Headers.Add("content-disposition", "inline; filename=" + Uri.EscapeDataString(fileName)); return File.OpenRead(upgradeFile); } public Stream TestJson(AgvUpgradeProgress progress) { JObject o = new JObject(); o["ret"] = "ok"; WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8"; return new MemoryStream(Encoding.UTF8.GetBytes(o.ToString())); } }
3 创建/配置服务
1 //创建服务 2 var wcf_file_service = new TestHttpService; 3 //创建服务主机 4 var file_service_host = new ServiceHost(wcf_file_service); 5 //获取协定 6 var wcfcontract = ContractDescription.GetContract(typeof(AgvUpgradeHttpInterface)); 7 8 string address = @"http://0.0.0.0:8888"; 9 10 var binding = new WebHttpBinding(); 11 binding.MaxBufferPoolSize = 524288; 12 binding.MaxBufferSize = 67108864; 13 binding.MaxReceivedMessageSize = 67108864; 14 binding.TransferMode = TransferMode.Streamed; 15 16 var serviceEndpoint = new ServiceEndpoint(wcfcontract, binding, new EndpointAddress(address)); 17 18 var httpBehavior = new WebHttpBehavior(); 19 httpBehavior.DefaultOutgoingRequestFormat = WebMessageFormat.Json; 20 httpBehavior.DefaultOutgoingResponseFormat = WebMessageFormat.Json; 21 serviceEndpoint.EndpointBehaviors.Add(new WebHttpBehavior()); 22 23 file_service_host.AddServiceEndpoint(serviceEndpoint); 24 25 var serviceMetadata = new ServiceMetadataBehavior(); 26 serviceMetadata.HttpGetEnabled = true; 27 serviceMetadata.HttpsGetEnabled = true; 28 serviceMetadata.HttpGetUrl = new Uri($"{address}/services"); 29 file_service_host.Description.Behaviors.Add(serviceMetadata); 30 31 32 33 file_service_host.Opened += delegate { Console.WriteLine("WCF file server 已经启动!"); }; 34 file_service_host.Open(); 35 36 //获取本机ip 37 /* String strHostName = string.Empty; 38 IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName()); 39 IPAddress[] addr = ipEntry.AddressList; 40 41 for (int i = 0; i < addr.Length; i++) 42 { 43 Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString()); 44 }*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)