1

我正在用 Visual Basic .NET 编写一个程序来在本地网络上的 PC 上执行操作。

我基本上在寻找某种极其简单的解决方案,以允许我:

  • 通过网络浏览器从网络上的其他机器调用子程序/函数
  • 如果可能,将参数发布到 url 中(参见下面的乐观示例)
  • 允许发送 html 的响应字符串(再次参见示例)

示例: 输入http://192.168.1.72/function/argument1/argument2将在该(本地网络)机器上运行我的 winforms 应用程序应用程序中的“函数”子/函数,并通过参数 1 和参数 2(如果包括),然后将响应页面/字符串返回到请求浏览器回馈

谁能指出我这样做的方法?我正在寻找一些相当简单但可靠的东西,因为它最终可能会全天候运行

4

2 回答 2

2

我正在寻找一些相当简单但可靠的东西,因为它最终可能会全天候运行

我认为最简单的方法是使用 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 将在您的方法中获得默认值。

于 2013-04-06T17:50:11.030 回答
1

您需要的只是某种形式的 Web 服务。您可能希望通过ASP.NET Web API使用 REST Web 服务。

不需要单独的进程间通信机制。

于 2013-04-06T16:30:48.350 回答