【问题标题】:WCF REST based GET request returing raw XML基于 WCF REST 的 GET 请求返回原始 XML
【发布时间】:2012-01-02 20:03:34
【问题描述】:

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

我收到错误远程服务器返回错误: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 和网络浏览器成功点击该方法。

【问题讨论】:

  • @rekire 我正在使用WebHttpBinding。此外,我确实有许多其他方法可以处理此服务定义,但是当创建返回类型为 StreamXmlElement 的方法时,它会失败。
  • 好的,感谢您关注@rekire!

标签: c# wcf httpwebrequest silverlight-3.0


【解决方案1】:

尝试将以下代码放入您的 web.config 文件中(适当更改 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>

【讨论】:

  • 感谢您的建议!不幸的是,我无法直接访问我正在测试的服务器,因此我无法读取日志文件。该服务本身是 SSL 并且是基于声明的 WIF 服务,这使得它在不访问服务器的情况下变得更加复杂。
  • +1,我将其标记为正确答案,即使我已经进行了配置,但直到今天早上才有权访问服务器查看文件。果然,我让我们的一位管理员向我发送了日志,它表明存在异常。该异常被掩盖了,因为它在本地工作...该异常是由于其中一台负载平衡服务器上缺少证书引起的...当然,我已在本地计算机上安装了证书,因此那里没有问题。感谢您的建议!
  • 很高兴能帮助克雷格,谢谢!
【解决方案2】:

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

出于安全原因,Silverlight 不会进行跨域 Web 服务调用,除非被调用域授予它权限(与 Flash 相同)。如果是这种情况,您将需要一个 clientaccesspolicy.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

【讨论】:

  • 有趣。 Silverlight 应用程序未与 WCF 服务在同一台服务器上运行。但是,目前我有许多服务方法在同一服务中按预期运行。所有其他方法都返回一个可序列化的对象。该问题仅在将返回类型更改为StreamXmlElement 时才显示出来。你会说我使用WebRequest 结合将Stream 返回到 Silverlight 应用程序的方式在可能的安全问题之外是正确的吗? Silverlight 不是我擅长的。
  • +1 提供有用的链接,谢谢。仍在努力解决问题的根源,但安全性可能与此有关。我已经尝试添加两个 XML 文件,但没有去那里。
  • @Craig 我从未尝试过返回流。我们将 WCF RIA 服务用于我们的大部分 Silverlight Web 服务工作。我可以告诉你,silverlight 只支持基本的 http 绑定,所以你不能使用 ws-* 扩展。
【解决方案3】:

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 访问

【讨论】:

  • 正确,NotFound 是 404 错误,但在我看来,当您通过 Silverlight 客户端连接服务器时出现任何 500 错误时,您会得到 500。你是说这不是Soilverlight的情况吗? (我不是 Silverlight 开发人员)。关于 URL,我可以通过 Web 浏览器和 Fiddler 成功访问该方法,并且我已经复制并粘贴了执行客户端代码的 URL。当您在对 CreateHttp 的调用中发现拼写错误时,我将更新问题,这在代码中实际上是正确的。对不起。有什么后续想法吗?
猜你喜欢
  • 2017-06-18
  • 2013-05-11
  • 2020-08-26
  • 2012-02-24
  • 1970-01-01
  • 2016-07-05
  • 2014-06-15
  • 2017-08-16
  • 1970-01-01
相关资源
最近更新 更多