从wcf服务返回html

时间:2010-01-07 10:59:38

标签: html wcf json jqgrid

我有一个Web服务,我需要从中返回一个包含html的字符串。这个html是Select控件的标记(用于jqGrid搜索过滤器),例如

<select><option id='1'> value 1 </option></select>  

我的WCF Web服务包含一个将此值作为字符串...

返回的方法
public string GetLeadTypeSelect()
{
    return "<select><option id='1'> value 1 </option></select>";
}  

此方法的合同是:

[OperationContract]
[WebInvoke(Method = "GET",
    BodyStyle = WebMessageBodyStyle.Bare,
    ResponseFormat = WebMessageFormat.Json)]
string GetLeadTypeSelect();  

我的问题是转义字符被插入到字符串中,因此渲染返回的HTML无用 - 服务返回:

"<select><option id='1'> value 1 <\/option><\/select>"  

结尾'/'<option>代码中的引号和转义<select>都会导致问题。

jqGrid使用返回的HTML显示下拉列表...

filterModel: [
    { label: 'Type', name: 'type', stype: 'select', surl: '../../../Services/Leads/GetLeads.svc/GetLeadTypeSelect' },

所以,我的问题是,如何将纯HTML从此Web服务返回给客户端,以便将其插入到我的HTML页面中?

提前感谢您的帮助, 科林。

2 个答案:

答案 0 :(得分:6)

我知道这是一篇旧帖子,但对于只在IIS中托管的服务,这里有一种简单的方法可以返回html:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public Stream getHtml()
{
    // get the html
    var html = DoSomethingToGetHtml();  //Not a built-in .Net method ;)

    // we want our result interpreted as plain html
    WebOperationContext.Current.OutgoingResponse.ContentType = "text/html; charset=utf-8";

    // create a stream from our html because trying to return a string adds an extra header tag
    //      to the response.  Returning a stream returns the html by itself
    var result = new MemoryStream(Encoding.UTF8.GetBytes(html));

    // return the result
    return result;
}

此代码在托管服务的web.config中需要以下内容:

<system.serviceModel>
    <!-- enable HttpContext.Current by setting aspNetCompatibilityEnabled=true-->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

    <behaviors>
        <endpointBehaviors>
            <behavior name="webHttpEnabled">              
                <webHttp/>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    ...
<system.serviceModel>

在服务配置中,设置behaviorConfiguration="webHttpEnabled"

以这种方式返回html会限制服务的可重用性,但如果您有理由确定该服务将始终在IIS中托管,则可以轻松解决问题。

答案 1 :(得分:0)

我假设您通过Javascript使用它。

如果你做了一个unescape(响应),你的问题应该得到解决。

另一方面,如果您不在Javascript中使用它,而只是在ASP.NET / PHP /任何网站中使用它,您可能只需返回一组值和显示值,这样您就可以重用其他代码中的web服务。

您的代码现在只能在HTML环境中使用。如果您需要明天使用您的Web服务编写.NET / C ++ /任何应用程序,该怎么办?然后你需要改变它。这不是网络服务的重点。 Web服务提高了代码的可重用性。你正在与之抗争。 (而且代码会赢!)