我正在用visual basic.net编写一个程序,在本地网络上的pc上执行操作。
我基本上是在寻找一种非常简单的解决方案,让我能够:
通过网络浏览器从网络上的其他计算机调用子程序/函数
如果可能的话,将参数发布到url中(参见下面的乐观示例)
允许发送HTML的响应字符串(再次参见示例)
例子:
输入http://192.168.1.72/function/argument1/argument2
将在该(本地联网)计算机上的Winforms应用程序中运行“function”子/函数,并传递argument1和argument2(如果包含它们),然后将响应页/字符串作为反馈返回给请求的浏览器
有人能指点我做这件事的方法吗?我在找一个相当简单但可靠的东西,因为它可能会24小时不停地运行
最佳答案
我在找一个相当简单但可靠的东西,因为它可能会24小时不停地运行
我认为最简单的方法是使用wcf的WebServiceHost类:
[ServiceContract]
public class MyService
{
[OperationContract, WebGet(UriTemplate = "/function/{argument1}/{argument2}")]
public string AMethod(string argument1, string argument2)
{
return argument1 + " " + argument2;
}
}
将这些行放到应用程序的formload(或任何其他入口点)中,
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
如果要使argument2对于ex是可选的,请调用
http://1192.168.1.72/MyService/AMethod?argument1=aaaa
Argument2将获得方法中的默认值。