简体   繁体   English

CommunicationException。 世界足球联合会

[英]CommunicationException. WCF


I has a problem with WCF. 我对WCF有问题。
The first application I wrote the example from the site this . 我从站点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 : 但是,当我获得客户端列表时,将出现以下CommunicationException

An error occurred while receiving the HTTP response to (localhost:8080). 收到对(localhost:8080)的HTTP响应时发生错误。 This could be due to the service endpoint binding not using the HTTP protocol. 这可能是由于服务端点绑定未使用HTTP协议。 This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). 这也可能是由于服务器终止了HTTP请求上下文(可能是由于服务关闭了)。 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: UPD:配置:

<?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: UPD2:
fails in: 失败于:

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

MobilePostClient created by Add Service Reference . MobilePostClientAdd Service Reference创建。

UPD3: IMobilePosts: UPD3:IMobile帖子:

[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. 存储库工作正确。

Did you set attributes to Post class properties? 您是否将属性设置为Post类属性?

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

You can trace all messages with ServiceBehavior read more here . 您可以使用ServiceBehavior跟踪所有消息, 在此处了解更多信息
ie 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
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM