如何将旧的 href cgi 调用转换为新的 wcf 服务?

How to convert an old href cgi call to a new wcf service?

我编写了一个 WCF 服务,旨在替换一些失效的 cgi-bin 代码。原来的HTML调用cgi(return是访问新站点的Url)是这样的

href="http://example.com/cgi-bin/webring/list.cgi?ringid=xxx;siteid=47"

我正在尝试的新HTML是这样的:

href="http://example.com/webring.svc/RJump/47,xxx"

生成的 HTML 将被分发,添加到几个现有网站中。

我已经将 WCF 服务设置为 return 包含所需 Url 的纯文本字符串,但是当按下相关按钮(在原始站点上)时,浏览器只会打开一个(几乎)空白页面仅包含 Url 作为字符串,而不是打开它所指的页面。

我不确定是我的 HTML 不正确,还是服务 return 类型错误。这是界面:

[ServiceContract]
public interface IWebRing
{
    // bare response for calling from HTML
    [OperationContract]
    [WebGet(UriTemplate = "/RJump/{data}",  BodyStyle = WebMessageBodyStyle.Bare)]
    System.IO.Stream RJump(string data);
 }

这是(简化的)方法(我 'borrowed' 来自 here 的代码):

public System.IO.Stream RJump(string data)
    {
        string Url = "http://example.net";
    // 'data' will define which site is actually required
        System.ServiceModel.Web.OutgoingWebResponseContext context = System.ServiceModel.Web.WebOperationContext.Current.OutgoingResponse;
        context.Headers.Add(System.Net.HttpResponseHeader.CacheControl, "public");
        context.ContentType = "text/plain";
        context.LastModified = DateTime.Now;
        context.StatusCode = System.Net.HttpStatusCode.OK;
        System.IO.Stream result = new System.IO.MemoryStream(System.Text.ASCIIEncoding.Default.GetBytes(Url));
        return result;
    }

我已经使用 javascript 和 async fetch() 使一切正常,但有些用户不想将脚本添加到他们的网站,所以这个替代解决方案必须是纯粹的 HTML (和原来一样)。

In your case, to return a raw string, set the ContentType to something like "text/plain" and return your data as a stream.

您提供的 link 表示代码正在返回一个字符串。
如果您希望 WCF 服务生成 html 响应,您可以尝试下面的代码和提供的示例 link。
Is it possible in WCF REST 4 to return HTML as one of the response formats
Generating html Response from my WCF service

 public XmlElement EchoWithGet(string s)
        {
            WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
            var x = new XmlDocument();
            x.LoadXml("<x>123</x>");
            return x.DocumentElement;
        }

Xml方法是方法,但是使用xml将html和脚本注入页面:

public XmlElement RJump(string data)
{
    String Url = functionOf(data);
    
    WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
    var x = new XmlDocument();
    x.LoadXml("<html><head><script>window.open('" + Url + "', '_self'); </script></head></html>");
    return x.DocumentElement;
}