- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在工作中,我们开发了一个可以从外部访问的 SOAP WCF API。由于对 API 的要求之一发生了变化,我想向该 API 添加一个新类,以便为某些函数调用生成正确的路径。
我们的 API 分为 3 个独立的库:
客户端当然可以在脚本中使用前两个,服务器拥有所有三个。
我希望添加到 API 的类如下所示:
namespace TenForce.Execution.API.Objects.Helpers
{
/// <summary>
/// <para>This interface defines the functionality available in the PathHelper for the API.</para>
/// </summary>
public interface IPathHelper
{
string ApplicationFolder { get; } // The HomeDataFolder for the application
string CompanyHomeFolder { get; } // The HomeDataFolder for the company.
string CustomFolder { get; } // The custom folder for professional services.
string WikiFolder { get; } // The WIKI folder to store pages.
string AddinsFolder { get; } // The AddinFolder to access the addins.
}
}
实际的类实现看起来像这样:
using System.IO;
using System.Runtime.Serialization;
using TenForce.Execution.BUL;
using TenForce.Execution.Framework;
namespace TenForce.Execution.API.Implementation.Helpers
{
/// <summary>
/// <para>This class provides a direct implementation of the IPathHelper for the API implementation
/// and manages all the paths inside the DataHomeFolder structure for the TenForce application.</para>
/// </summary>
[DataContract]
public class PathHelper : Objects.Helpers.IPathHelper
{
#region Private Fields
private readonly ParameterBUL _mParameterBul;
private const Parameter.ParameterId DataHomeFolderId = Parameter.ParameterId.DataHomeFolder;
private const Parameter.ParameterId CompanyNameId = Parameter.ParameterId.CompanyName;
#endregion
#region Constructor
/// <summary>
/// <para>Creates a new instance of the PathHelper class</para>
/// </summary>
public PathHelper()
{
_mParameterBul = new ParameterBUL();
}
#endregion
#region IPathHelper Members
/// <summary>
/// <para>Returns the absolute path to the DataHomeFolder of the TenForce Application.</para>
/// </summary>
[DataMember]
public string ApplicationFolder
{
get
{
return CreatePath(_mParameterBul.GetParameterValue(DataHomeFolderId));
}
}
/// <summary>
/// <para>Returns the absolute path to the Company DataHomeFolder.</para>
/// </summary>
[DataMember]
public string CompanyHomeFolder
{
get
{
return CreatePath(Path.Combine(ApplicationFolder, _mParameterBul.GetParameterValue(CompanyNameId)));
}
}
/// <summary>
/// <para>Returns the absolute path to the Company custom folder.</para>
/// </summary>
[DataMember]
public string CustomFolder
{
get
{
return CreatePath(Path.Combine(CompanyHomeFolder, @"custom"));
}
}
/// <summary>
/// <para>Returns the absolute path to the Company wiki folder.</para>
/// </summary>
[DataMember]
public string WikiFolder
{
get
{
return CreatePath(Path.Combine(CompanyHomeFolder, @"wiki"));
}
}
/// <summary>
/// <para>Returns the absolute path to the Company addins folder.</para>
/// </summary>
[DataMember]
public string AddinsFolder
{
get
{
return CreatePath(Path.Combine(CompanyHomeFolder, @"addins"));
}
}
#endregion
#region Private Members
/// <summary>
/// <para>Checks if the specified path exists, and creates the path
/// if the system cannot find it.</para>
/// </summary>
/// <param name="path">The path to verify.</param>
private static string CreatePath(string path)
{
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
return path;
}
#endregion
}
}
总的来说,这是非常基本的东西。 WCF 服务由我们使用可通过 .NET 获得的工厂和类动态创建。 WCF 服务可以完美地处理服务中已存在的所有代码。
所以我决定在我们的服务类中添加以下行:
/// <summary>
/// <para>Returns the PathHelper to construct the various paths for API Scripts.</para>
/// </summary>
/// <returns>An instance of the PathHelper.</returns>
public Objects.Helpers.IPathHelper GetPathHelper()
{
return new Helpers.PathHelper();
}
#endregion
当我运行单元测试时,除了那些检查 PathHelper 功能的测试之外,所有测试都在工作,它们都以相同的错误消息/异常结束:
Error 1 TestCase 'TenForce.Execution.API.ImplementationTest/HelperTests/CheckApplicationFolderPath' failed: Execute System.ServiceModel.CommunicationException: The remote endpoint no longer recognizes this sequence. This is most likely due to an abort on the remote endpoint. The value of wsrm:Identifier is not a known Sequence identifier. The reliable session was faulted.
Server stack trace: at System.ServiceModel.Channels.ReliableRequestSessionChannel.SyncRequest.WaitForReply(TimeSpan timeout) at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at TenForce.Execution.API.Contracts.IAPI.GetPathHelper() at TenForce.Execution.API.ServiceClient.ServiceAPI.GetPathHelper() in c:\Users\arne.de.herdt\Documents\Trunk\Robinson\TenForce.Execution.API.ServiceClient\ServiceAPI.cs:line 163 at TenForce.Execution.API.ImplementationTest.HelperTests.CheckApplicationFolderPath() in C:\Users\arne.de.herdt\Documents\Trunk\Robinson\TenForce.Execution.API.ImplementationTest\HelperTests.cs:line 56 c:\Users\arne.de.herdt\Documents\Trunk\Robinson\TenForce.Execution.API.ServiceClient\ServiceAPI.cs 163
我不知道哪里出了问题,或者我错过了什么。该代码适用于已经存在的内容,但是当我添加我的作品时,它变得乱七八糟,但现有功能仍然有效。是我造成了问题。
最佳答案
这个错误对我来说似乎很奇怪,可能与您动态生成服务的方式有关。
但是,该类不可序列化,该类的属性是只读的(没有设置访问器)。为了将属性标记为 DataMember,属性需要有一个 set 访问器,即使它被标记为私有(private)。来自 MSDN:
Note Properties to which the DataMemberAttribute attribute has been applied must have both get and set fields; they cannot be get-only or set-only.
您可能希望在该类中序列化的唯一对象是 m_ParameterBul 变量,因此将其标记为 DataMember 并从只读属性中删除所有其他 DataMember 属性即可。
您应该注意,如果 m_ParameterBul 不依赖于服务器,则无需在服务器端创建此类,因为一切都与客户端相关。在这种情况下,您应该直接在客户端上创建它。
希望对您有所帮助!
/// <summary>
/// <para>This class provides a direct implementation of the IPathHelper for the API implementation
/// and manages all the paths inside the DataHomeFolder structure for the TenForce application.</para>
/// </summary>
[DataContract]
public class PathHelper : Objects.Helpers.IPathHelper
{
#region Private Fields
[DataMember]
private readonly ParameterBUL _mParameterBul;
private const Parameter.ParameterId DataHomeFolderId = Parameter.ParameterId.DataHomeFolder;
private const Parameter.ParameterId CompanyNameId = Parameter.ParameterId.CompanyName;
#endregion
#region Constructor
/// <summary>
/// <para>Creates a new instance of the PathHelper class</para>
/// </summary>
public PathHelper()
{
_mParameterBul = new ParameterBUL();
}
#endregion
#region IPathHelper Members
/// <summary>
/// <para>Returns the absolute path to the DataHomeFolder of the TenForce Application.</para>
/// </summary>
public string ApplicationFolder
{
get
{
return CreatePath(_mParameterBul.GetParameterValue(DataHomeFolderId));
}
}
/// <summary>
/// <para>Returns the absolute path to the Company DataHomeFolder.</para>
/// </summary>
public string CompanyHomeFolder
{
get
{
return CreatePath(Path.Combine(ApplicationFolder, _mParameterBul.GetParameterValue(CompanyNameId)));
}
}
/// <summary>
/// <para>Returns the absolute path to the Company custom folder.</para>
/// </summary>
public string CustomFolder
{
get
{
return CreatePath(Path.Combine(CompanyHomeFolder, @"custom"));
}
}
/// <summary>
/// <para>Returns the absolute path to the Company wiki folder.</para>
/// </summary>
public string WikiFolder
{
get
{
return CreatePath(Path.Combine(CompanyHomeFolder, @"wiki"));
}
}
/// <summary>
/// <para>Returns the absolute path to the Company addins folder.</para>
/// </summary>
public string AddinsFolder
{
get
{
return CreatePath(Path.Combine(CompanyHomeFolder, @"addins"));
}
}
#endregion
#region Private Members
/// <summary>
/// <para>Checks if the specified path exists, and creates the path
/// if the system cannot find it.</para>
/// </summary>
/// <param name="path">The path to verify.</param>
private static string CreatePath(string path)
{
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
return path;
}
#endregion
}
关于c# - 返回数据时出现 WCF CommunicationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5257161/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!