调用wcf的get函数会抛出CommunicationException

时间:2015-05-17 18:35:55

标签: c# asp.net wcf

我有两个项目。一个有wcf服务和数据库。其他用于调用这些函数。如果我调用webservice的函数,它会向数据库添加一些东西,它可以正常工作。但是当我调用一个从数据库中检索内容的函数时。我得到了CommunicationException。我在WebService.svc.cs中调用的函数是:

public List<Artist> GetAllArtists()
        {
            Database1Entities db = new Database1Entities();
            return (db.Artists).ToList();
        }

我称之为

    protected void Page_Load(object sender, EventArgs e)
    {
        ServiceReference2.WebServiceClient o = new ServiceReference2.WebServiceClient();
        Artist [] artists = o.GetAllArtists(); //Exception arises here
        string str = "";
        foreach (Artist artist in artists){
            str += artist.ArtistID + " ";
        }
        Response.Write(str);
        gv.DataSource = artists;
        gv.DataBind();
    }

例外:

  

System.ServiceModel.CommunicationException未被用户代码处理   HResult = -2146233087 Message =接收HTTP时发生错误   回复http://localhost:23060/WebService.svc。这可能是应该的   不使用HTTP协议的服务端点绑定。这个   也可能是由于HTTP请求上下文被中止   服务器(可能是由于服务关闭)。查看服务器日志   更多细节。 Source = mscorlib StackTrace:服务器堆栈跟踪:at   System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(引发WebException   webException,HttpWebRequest请求,HttpAbortReason abortReason)at   System.ServiceModel.Channels.HttpChannelFactory1.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度   超时)            在System.ServiceModel.Channels.RequestChannel.Request(消息消息,   TimeSpan超时)            在System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息
  消息,TimeSpan超时)            在System.ServiceModel.Channels.ServiceChannel.Call(String action,Boolean oneway,ProxyOperationRuntime operation,Object [] ins,   对象[]输出,TimeSpan超时)            在System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage)   methodCall,ProxyOperationRuntime操作)            在System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage
  信息)         在[0]处重新抛出异常:            在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage   reqMsg,IMessage retMsg)            在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&amp;
  msgData,Int32类型)            at WebLab6AlbumManagementSystemClient.ServiceReference2.IWebService.GetAllArtists()            在WebLab6AlbumManagementSystemClient.ServiceReference2.WebServiceClient.GetAllArtists()   在c:\ Users \ Muhammad Rehan \ Documents \ Visual Studio中   2013 \项目\ WebLab6AlbumManagementSystemClient \服务
  参考文献\ ServiceReference2 \ Reference.cs:第567行            在WebLab6AlbumManagementSystemClient.ViewAllArtists.Page_Load(对象
  发件人,EventArgs e)在c:\ Users \ Muhammad Rehan \ Documents \ Visual
中   工作室
  2013 \项目\ WebLab6AlbumManagementSystemClient \ ViewAllArtists.aspx.cs:行   16            在System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender,   EventArgs e)            在System.Web.UI.Control.OnLoad(EventArgs e)            在System.Web.UI.Control.LoadRecursive()            在System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)

     

InnerException:System.Net.WebException            的HResult = -2146233079            Message =基础连接已关闭:接收时发生意外错误。            来源=系统            堆栈跟踪:                 在System.Net.HttpWebRequest.GetResponse()                 at System.ServiceModel.Channels.HttpChannelFactory1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan)   timeout)InnerException:System.IO.IOException HResult = -2146232800   消息=无法从传输连接读取数据:现有的   连接被远程主机强行关闭。来源=系统   StackTrace:在System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,   System.Net.PooledStream.Read(Byte []的Int32偏移量,Int32大小)   缓冲区,Int32偏移量,Int32大小)at   System.Net.Connection.SyncRead(HttpWebRequest请求,布尔值   userRetrievedStream,Boolean probeRead)InnerException:   System.Net.Sockets.SocketException HResult = -2147467259 Message = An   远程主机强行关闭现有连接   Source = System ErrorCode = 10054 NativeErrorCode = 10054 StackTrace:at   System.Net.Sockets.Socket.Receive(Byte []缓冲区,Int32偏移量,Int32   size,SocketFlags socketFlags)at   System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量,   Int32 size)InnerException:

2 个答案:

答案 0 :(得分:0)

所有WCF错误消息都是如此神秘,以至于始终不知道导致错误本身的原因。 您错误的原因很可能是某些序列化问题。 尝试添加日志记录或编写测试以使用DataContractSerializer序列化您的艺术家数组。

答案 1 :(得分:0)

 protected void Page_Load(object sender, EventArgs e)
{
    ServiceReference2.WebServiceClient o = new ServiceReference2.WebServiceClient();
    Artist [] artists = o.GetAllArtists().ToArray(); //Exception will not //come now
    string str = "";
    foreach (Artist artist in artists){
        str += artist.ArtistID + " ";
    }
    Response.Write(str);
    gv.DataSource = artists;
    gv.DataBind();
}

在服务设置中签入集合默认类型被选为阵列或列表。我认为在你的情况下它被设置为List,因为Service返回List,而在这里你将它分配给Array变量。所以尝试添加.ToArray()或将Default更改为Array。