繁体   English   中英

CommunicationException。 世界足球联合会

[英]CommunicationException. WCF


我对WCF有问题。
我从站点this编写示例的第一个应用程序。 效果很好。
我需要创建一个应用程序来从数据库的服务器列表中传输对象。 但是,当我获得客户端列表时,将出现以下CommunicationException

收到对(localhost:8080)的HTTP响应时发生错误。 这可能是由于服务端点绑定未使用HTTP协议。 这也可能是由于服务器终止了HTTP请求上下文(可能是由于服务关闭了)。 有关更多详细信息,请参见服务器日志。

服务器工作正常,或者我听不懂。
如果您需要有关该项目的信息(代码),我会给您


对不起我的英语不好。

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>

服务器代码:

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:
失败于:

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

MobilePostClientAdd Service Reference创建。

UPD3:IMobile帖子:

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

    [OperationContract]
    FullPost GetFullPost(int postId);
}

移动帖子:

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);
    }
}

存储库工作正确。

您是否将属性设置为Post类属性?

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

您可以使用ServiceBehavior跟踪所有消息, 在此处了解更多信息
即把属性到服务

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

并将跟踪输出设置为文件

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