我正在用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将获得方法中的默认值。

10-08 03:20