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

时间:2012-01-02 20:03:35

标签: c# wcf httpwebrequest silverlight-3.0

我想要完成的是在我的基于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和网络浏览器成功点击该方法。

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>

答案 1 :(得分:1)

这是另一件需要检查的事情:domain.com与您运行Silverlight应用程序的域名完全相同(例如 - 您的SL应用程序是从localhost / xx开始,而您的Web服务调用是否发送到domain.com?< / p>

出于安全原因,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

答案 2 :(得分:0)

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

提供