[英]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();
MobilePostClient
由Add 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.