基于WCF REST的GET请求返回原始XML

本文关键字:返回 原始 XML 请求 GET WCF REST 基于 | 更新日期: 2023-09-27 18:19:11

我想要完成的是添加一个GET方法到我的WCF基于REST的服务,并通过WebRequest类从Silverlight 3客户端应用程序访问它。

我得到错误远程服务器返回一个错误:NotFound。,据我所知,这可能只是服务器上遇到的任何500个错误的通用错误。

WCF运行合同:

[OperationContract, WebGet(UriTemplate = "path/{id}")]
Stream Get(string id);

操作实现:

public Stream Get(string id)
{
    WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml; charset=utf-8";
    return new MemoryStream(Encoding.UTF8.GetBytes("<xml><id>1</id><name>Some Name</name></xml>));
}

抛出异常的客户端代码:

HttpWebRequest webRequest = WebRequest.CreateHttp("http://domain.com/my-service.svc/path/1");
webRequest.BeginGetResponse(
    x =>
    {
        try
        {
            using (WebResponse webResponse = webRequest.EndGetResponse(x)) <--Exception thrown here
            using (Stream stream = webResponse.GetResponseStream())
            {
               //do stuff here...eventually.
            }
        }
        catch (Exception ex)
        {
        }
    },
    null);

我怀疑它与返回类型有关,并且也尝试返回XmlElement但无济于事。我真的被难住了,你知道我可能做错了什么吗?

注意,我可以通过Fiddler和web浏览器成功地点击这个方法。

基于WCF REST的GET请求返回原始XML

试着把下面的代码放到你的网页中。配置文件(修改initializeData属性中的文件名)

如果你正在使用完整的IIS,而不是Casini或IIS Express(我使用后者),请确保将日志文件放在您的web应用程序具有写权限的地方)。这将导致WCF生成一个相当详细的日志文件。我发现这个日志很方便。

<>之前 <system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true"> <listeners> <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData= "c:'temp'WEBTraces.log" /> </listeners> </source> </sources> </system.diagnostics>

还有一件事要检查:domain.com是否与您的silverlight应用程序运行的域名完全相同(例如—您的SL应用程序是否以localhost/xx开始,并且您的web服务调用到domain.com?

出于安全原因,Silverlight不会进行跨域的web服务调用,除非被调用的域授予它权限(与Flash相同)。如果是这种情况,您将需要一个clientaccessppolicy .xml文件。

你可以在这里阅读:http://weblogs.asp.net/jgalloway/archive/2008/12/12/silverlight-crossdomain-access-workarounds.aspx

这里有一个视频:http://www.silverlight.net/learn/data-networking/introduction-to-data-and-networking/how-to-use-cross-domain-policy-files-with-silverlight

这里有一些帮助:http://timheuer.com/blog/archive/2008/04/06/silverlight-cross-domain-policy-file-snippet-intellisense.aspx

NotFound应该是404而不是500。错误的URI可能会产生404错误。

Uri resturi = new Uri(String.Format("http://{0}:8080/MyService/", hostname)); // http
WebHttpBinding rest = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly); // WebHttpSecurityMode.Transport for ssl
host.AddServiceEndpoint(typeof(IMyService), rest, resturi);
在上面的代码示例中,您的服务将通过http://host:8080/MyService/path/1
可用。