我正在寻找一些相当简单但可靠的东西,因为它最终可能会全天候运行
我认为最简单的方法是使用 WCF 的WebServiceHost类:
[ServiceContract]
public class MyService
{
[OperationContract, WebGet(UriTemplate = "/function/{argument1}/{argument2}")]
public string AMethod(string argument1, string argument2)
{
return argument1 + " " + argument2;
}
}
将此行放入应用程序的表单加载(或任何其他入口点),
var wsh = new WebServiceHost(typeof(MyService), new Uri("http://0.0.0.0/MyService"));
wsh.Open();
并http://192.168.1.72/Myservice/function/a/b
从您的浏览器中调用。就这些。
----完整的工作代码----
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
var wsh = new WebServiceHost(typeof(MyService), new Uri("http://0.0.0.0/MyService"));
wsh.Open();
}
}
[ServiceContract]
public class MyService
{
[OperationContract, WebGet(UriTemplate = "/function/{argument1}/{argument2}")]
public string AMethod(string argument1, string argument2)
{
return argument1 + " " + argument2;
}
///******** EDIT ********
///
[OperationContract, WebGet(UriTemplate = "/function2/{argument1}/{argument2}")]
public Stream F2(string argument1, string argument2)
{
return ToHtml("<html><h1>" + argument1 + " " + argument2 + "</h1></HtmlDocument>");
}
static Stream ToHtml(string result)
{
var data = Encoding.UTF8.GetBytes(result);
WebOperationContext.Current.OutgoingResponse.ContentType = "text/html; charset=utf-8";
WebOperationContext.Current.OutgoingResponse.ContentLength = data.Length;
return new MemoryStream(data);
}
///END OF EDIT
}
}
编辑
是否可以确定请求来自的 IP 地址?
var m = OperationContext.Current
.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
var address = m.Address;
有什么方法可以使 {arguments} 可选?
只需从属性中删除UriTemplate
参数。WebGet
然后你的网址将是
http://1192.168.1.72/MyService/AMethod?argument1=aaaa&argument2=bbb
如果你想让参数 2 对 ex 来说是可选的,调用 as
http://1192.168.1.72/MyService/AMethod?argument1=aaaa
并且 argument2 将在您的方法中获得默认值。