CommunicationException. WCF

3k views Asked by At


I has a problem with WCF.
The first application I wrote the example from the site this. It worked good.
I need to make an application to transfer objects from the server list from the database. But when I get a list of the client, the following CommunicationException:

An error occurred while receiving the HTTP response to (localhost:8080). This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.

Server worked good or I do not understand something.
If you need information (code) on the project will be, I will give it


Sorry for my English.

UPD: config:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Habra.Server.MobilePosts" behaviorConfiguration="MyBehavior">
        <endpoint
            address=""
            binding="basicHttpBinding"
            contract="Habra.Core.IMobilePosts" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

server code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Habra.Server
{
    using System.ServiceModel;

    public class Program
    {
        public static void Main(string[] args)
        {
            Type serviceType = typeof(MobilePosts);
            Uri serviceUri = new Uri("http://localhost:8080/");
            ServiceHost host = new ServiceHost(serviceType, serviceUri);
            host.Open();

            foreach (Uri uri in host.BaseAddresses)
            {
                Console.WriteLine("\t{0}", uri.ToString());
            }

            Console.WriteLine();
            Console.WriteLine("Number of dispatchers listening : {0}", host.ChannelDispatchers.Count);
            foreach (System.ServiceModel.Dispatcher.ChannelDispatcher dispatcher in host.ChannelDispatchers)
            {
                Console.WriteLine("\t{0}, {1}", dispatcher.Listener.Uri.ToString(), dispatcher.BindingName);
            }

            Console.WriteLine();
            Console.WriteLine("Press <ENTER> to terminate Host");
            Console.ReadLine();
        }
    }
}

UPD2:
fails in:

MobilePostsClient mpc = new MobilePostsClient();
var list = mpc.GetAllPosts();

MobilePostClient created by Add Service Reference.

UPD3: IMobilePosts:

[ServiceContract]
public interface IMobilePosts
{
    [OperationContract]
    List<Post> GetAllPosts();

    [OperationContract]
    FullPost GetFullPost(int postId);
}

MobilePosts:

public class MobilePosts : IMobilePosts
{
    private readonly IRepository repository = new RepositoryQueries();

    public List<Post> GetAllPosts()
    {
        var list = this.repository.GetAllPosts();

        foreach (Post post in list)
        {
            Console.WriteLine(post.Title + " loading...");
        }

        return list;
    }

    public FullPost GetFullPost(int postId)
    {
        return this.repository.GetFullPostById(postId);
    }
}

Repositories worked correct.

1

There are 1 answers

0
Radik On BEST ANSWER

Did you set attributes to Post class properties?

[DataContract]
public class Post
{
    [DataMember]
    public string Post{get;set;}

You can trace all messages with ServiceBehavior read more here.
i.e. put attribute to servie

[SilverlightFaultAttribute]
public class MobilePosts : IMobilePosts        
{...}

and set trace output to file

using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Xml;

namespace Wcf
{
public class SilverlightFaultAttribute : Attribute, IServiceBehavior
{
    #region IServiceBehavior Members

    public void AddBindingParameters(ServiceDescription serviceDescription,
        ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints,
        BindingParameterCollection bindingParameters)
    {

    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        Trace.WriteLine(" */*/*/* ApplyDispatchBehavior");

        foreach (var t in serviceHostBase.ChannelDispatchers)
        {
            var channelDispatcher = t as ChannelDispatcher;
            if ((channelDispatcher == null)) continue;
            foreach (var dispatcher2 in channelDispatcher.Endpoints)
            {
                var dispatchRuntime = dispatcher2.DispatchRuntime;
                dispatchRuntime.MessageInspectors.Add(new SilverlightFaultMessageInspector());
            }
        }
    }
    public class SilverlightFaultMessageInspector : IDispatchMessageInspector
    {
        public void BeforeSendReply(ref Message reply, object correlationState)
        {
            if (reply.IsFault)
            {
                Trace.WriteLine(" */*/*/* reply.IsFault");
                Trace.WriteLine(reply);
                var property = new HttpResponseMessageProperty();

                // Here the response code is changed to 200.
                property.StatusCode = System.Net.HttpStatusCode.OK;

                reply.Properties[HttpResponseMessageProperty.Name] = property;

                MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);
                Message copy = buffer.CreateMessage();  // Create a copy to work with
                reply = buffer.CreateMessage();         // Restore the original message 

                object faultDetail = ReadFaultDetail(copy);
                Exception exception = faultDetail as Exception;
                Trace.WriteLine(exception);
            }
        }

        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            // Do nothing to the incoming message.
            return null;
        }

        private static object ReadFaultDetail(Message reply)
        {
            const string detailElementName = "Detail";
            using (XmlDictionaryReader reader = reply.GetReaderAtBodyContents())
            {
                // Find <soap:Detail>
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element && reader.LocalName == detailElementName)
                    {
                        break;
                    }
                }

                // Did we find it?
                if (reader.NodeType != XmlNodeType.Element || reader.LocalName != detailElementName)
                {
                    return null;
                }
                // Move to the contents of <soap:Detail>
                if (!reader.Read())
                    return null;
                // Deserialize the fault
                NetDataContractSerializer serializer = new NetDataContractSerializer();
                try
                {
                    return serializer.ReadObject(reader);
                }
                catch (FileNotFoundException)
                {
                    // Serializer was unable to find assembly where exception is defined 
                    return null;
                }
            }
        }
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }

    #endregion
}
}