Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于WCF REST的获取请求返回原始XML_C#_Wcf_Httpwebrequest_Silverlight 3.0 - Fatal编程技术网

C# 基于WCF REST的获取请求返回原始XML

C# 基于WCF REST的获取请求返回原始XML,c#,wcf,httpwebrequest,silverlight-3.0,C#,Wcf,Httpwebrequest,Silverlight 3.0,我试图完成的是将GET方法添加到基于WCF REST的服务中,并从Silverlight 3客户端应用程序通过WebRequest类访问它 我收到错误远程服务器返回了一个错误:NotFound。据我所知,这可能只是服务器上遇到的任何500个错误的一般错误 WCF运营合同: [OperationContract, WebGet(UriTemplate = "path/{id}")] Stream Get(string id); 操作实施: public Stream Get(string id)

我试图完成的是将
GET
方法添加到基于WCF REST的服务中,并从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>));
}
公共流获取(字符串id)
{
WebOperationContext.Current.OutgoingResponse.ContentType=“应用程序/xml;字符集=utf-8”;
返回新的MemoryStream(Encoding.UTF8.GetBytes(“1Some Name”);
}
引发异常的客户端代码:

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);
HttpWebRequest-webRequest=webRequest.CreateHttp(“http://domain.com/my-service.svc/path/1");
webRequest.BeginGetResponse(
x=>
{
尝试
{

使用(WebResponse WebResponse=webRequest.EndGetResponse(x))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

尝试将下面的代码放入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>


这里还有一件事需要检查:domain.com是否与运行silverlight应用程序的域名完全相同(例如,您的SL应用程序是否以localhost/xx启动,您的web服务呼叫是否转到domain.com

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

您可以在此处阅读:

这里有一段视频:


这里有一些帮助:

正确,NotFound是404错误,但在我看来,通过Silverlight客户端连接时,如果服务器上抛出500个错误,您会得到500。您是说Soilverlight不是这样吗?(我不是Silverlight开发人员)。关于URL,我可以通过web浏览器和Fiddler成功访问该方法,并且我已从执行客户端代码的位置复制并粘贴了URL。当您在调用
CreateHttp
时发现输入错误,我将更新该问题,这在代码中实际上是正确的。抱歉。有任何后续想法吗?感谢您的建议!Un幸运的是,我没有直接访问正在测试的服务器的权限,因此无法读取日志文件。该服务本身是SSL,是一个基于声明的WIF服务,不访问服务器会使它变得更复杂。+1我将此标记为正确答案,尽管我已经对此进行了配置,但尚未配置访问服务器以查看文件直到今天早上。果然,我让我们的一名管理员向我发送了日志,它指示了一个异常。异常被掩盖,因为它在本地工作…异常是由于一个负载平衡的服务器上缺少证书造成的…当然,我已经在我的loc上安装了证书al machine,因此没有问题。谢谢你的建议!很高兴我能帮助Craig谢谢!有趣。Silverlight应用程序与WCF服务不在同一台服务器上运行。但是,目前我在同一个服务中有许多服务方法按预期运行。所有其他方法返回一个可序列化对象。问题em仅在将返回类型更改为
Stream
xmlement
时显示头部。您认为我使用
WebRequest
与将
Stream
返回到Silverlight应用程序相结合的方式在可能的安全问题之外是正确的吗?Silverlight不是我擅长的东西。+1lpful链接,谢谢。仍在努力找到问题的根源,但安全性可能与此有关。我尝试添加了两个XML文件,但没有成功。@Craig我从未尝试返回流。我们在Silverlight web服务的大部分工作中使用WCF RIA服务。我可以告诉你,Silverlight只支持基本的http bin是的,所以你不能使用ws-*扩展。@rekire我使用的是
WebHttpBinding
。另外,我有很多其他方法处理这个服务定义,但是当创建一个返回类型为
Stream
XmlElement
的方法时,就是失败的时候。好的,谢谢你查找@rekire!