我目前正在使用MVC4来处理项目的服务器端代码。我的目标是使用基本的MVC样式将对象列表发送到客户端应用程序。
也就是说,我有一个“Controller”类,它有一个处理基本get请求的函数。
这是该功能:
/// <summary>
/// The installer(uninstaller in this case), will need the known malicious programs.
/// </summary>
/// <param name="User_ID"></param>
/// <param name="UC"></param>
/// <param name="Implementation_ID"></param>
/// <returns>Sends a serialized list of extensions as an object that will be shared.</returns>
[HttpGet]
[ValidateInput(false)]
public ActionResult SendExtensions(Guid User_ID, string UC, string Implementation_ID)
{
System.Diagnostics.Debug.WriteLine("----Send Serialized Malicious Extensions----");
string ipAddress = Utility.GetIPAddress();
System.Diagnostics.Debug.WriteLine("IP: " + ipAddress);
string Country = GeoIPHelper.GetCountryCode(ipAddress);
System.Diagnostics.Debug.WriteLine("Country: " + GeoIPHelper.GetCountryCode(ipAddress));
System.Diagnostics.Debug.WriteLine("User ID: " + User_ID);
System.Diagnostics.Debug.WriteLine("User Class: " + UC);
System.Diagnostics.Debug.WriteLine("Implementation ID: " + Implementation_ID);
try
{
using (ValidationManager manager = new ValidationManager())
{
System.Diagnostics.Debug.WriteLine("Getting data from DB.");
//Grab the users installed malicious applications. (Extensions + Programs)
List<CheckUserExtensionsResult> userExts = manager.CheckUserExtensions(User_ID);
//using (var stream = new StreamWriter(Request.InputStream))
{
//Convert the list into an object.
List<BlockedExtension> sList = ConvertToSerializableList(userExts);
//Serializer.
BinaryFormatter serializer = new BinaryFormatter();
//Send the serialized object.
serializer.Serialize(Request.InputStream, sList);
}
}
}
catch (Exception ex)
{
_log.Error(ex.Message, ex);
}
return new EmptyResult();
}
客户端应用程序具有通过用户ID发送并返回恶意扩展列表的功能:
/// Grab a list of the installed malicious extensions.
public static void GetMalicousExtensions(string User_ID, string UC, string Implementation_ID)
{
try
{
// Debug
System.Diagnostics.Debug.WriteLine("GetMalExt Running");
WebRequest request = WebRequest.Create(string.Format("http://localhost:35555/Secure/SendExtensions?User_ID={0}&UC={1}&Implementation_ID={2}"
, User_ID
, UC
, Implementation_ID
));
System.Diagnostics.Debug.WriteLine("Request made.");
request.Method = "GET";
System.Diagnostics.Debug.WriteLine("Method set.");
request.Timeout = 10000;//10 seconds for debug, switch to 5 for release.
System.Diagnostics.Debug.WriteLine("Serializer initialized.");
BinaryFormatter serializer = new BinaryFormatter();
System.Diagnostics.Debug.WriteLine("Getting the stream.");
var mList = (serializer.Deserialize(request.GetResponse().GetResponseStream()));
//request.
System.Diagnostics.Debug.WriteLine("GetMalExt deserialized");
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("Exception: " + ex.Message);
}
}
///
被序列化的数据是一个包含有关恶意扩展的数据的类,现在它只存储恶意扩展的名称。尽管如此,这里是被发送的类。注意:我实际上发送了一个可序列化对象的列表,我不知道这是否会导致任何问题。
///
///For testing, this should be moved to a shared file.
[Serializable()]
public class BlockedExtension : ISerializable
{
string Extension_Name = "";
public BlockedExtension(string Extension_Name)
{
this.Extension_Name = Extension_Name;
}
public BlockedExtension(SerializationInfo info, StreamingContext ctxt)
{
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
}
}
因此,在尽可能多地给你背景之后,问题在于我何时发送/接收序列化数据。我把这些函数调得很好并得到了两端的响应,但是一旦发送序列化数据,我就会得到双方的错误。
我对通过MVC4发送序列化数据的任何技术文档持开放态度,因为我还没有找到任何技术文档。所有这些都是使用来自不同类型应用程序的snippit组合在一起的。我在这个主题上找到的大部分文档都是用于TCP连接,我不想为这个应用程序设置。
对此事的任何帮助都将非常感激。
答案 0 :(得分:1)
您正在尝试使用 RESPONSE 中要发送的信息写入 REQUEST 输入流。
此外,您的数据二进制视图非常具体;我想您可能想要考虑这是否适合您的域的服务器API编程模型--WCF似乎更适用于您正在追求的二进制流格式。