Можете ли вы попробовать использовать FormData()
:
$("form#files").submit(function(){
var formData = new FormData($(this)[0]);
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
Вышеприведенный примерный код, но вы можете использовать его для его изменения.
Используя MarshallByRef выполнит Ваши методы в удаленном AppDomain. При использовании CreateInstanceAndUnwrap с сериализуемым объектом копия объекта сделана к локальному AppDomain, таким образом, любой вызов метода будет выполняться в локальном AppDomain.
, Если то, что Вы хотите, должно связаться между AppDomains, идут с подходом MarshallByRef.
пример:
using System;
using System.Reflection;
[Serializable]
public class SerializableClass
{
public string WhatIsMyAppDomain()
{
return AppDomain.CurrentDomain.FriendlyName;
}
}
public class MarshallByRefClass : MarshalByRefObject
{
public string WhatIsMyAppDomain()
{
return AppDomain.CurrentDomain.FriendlyName;
}
}
class Test
{
static void Main(string[] args)
{
AppDomain ad = AppDomain.CreateDomain("OtherAppDomain");
MarshallByRefClass marshall = (MarshallByRefClass)ad.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, "MarshallByRefClass");
SerializableClass serializable = (SerializableClass)ad.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, "SerializableClass");
Console.WriteLine(marshall.WhatIsMyAppDomain());
Console.WriteLine(serializable.WhatIsMyAppDomain());
}
}
Этот код отобразит "OtherAppDomain" при вызове WhatIsMyAppDomain от объекта MarshallByRef и названия AppDomain по умолчанию, когда Вы звоните от сериализуемого объекта.
Эти подходы имеют существенно различные эффекты.
С версией MarshalByRef Вы создаете 1 экземпляр своего объекта. Это будет жить в недавно созданном AppDomain. Весь accesse к объекту сделан через TransparentProxy.
С сериализуемой версией Вы создаетесь 2 экземпляра Вашего объекта. Каждый создается в недавно созданном AppDomain. Вызов CreateInstanceAndUnwrap тогда сериализирует этот объект и десериализует его в домене исходного приложения. Это создает вторую версию объекта, который абсолютно независим сначала. На самом деле очень следующий GC почти наверняка устранит исходный объект, и Вас оставят с одним экземпляром.
, Почему оба подхода имеют тот же эффект?
Они делают не , имеют тот же эффект.
С MarshalByRefObject
Вы ссылаетесь на один объект через границы AppDomain. С [Serializable]
делается копия объекта. Это обнаружится, если состояние объекта будет изменено в дочернем домене и затем исследовано снова (или выполнитесь Console.WriteLine
внутренняя часть дочерний AppDomain).
MarshalByRefValue
и Serializable
реализуют другую семантику для дистанционной работы/креста коммуникация AppDomain. MarshalByRefValue
по существу дает Вам ссылочную семантику через объект прокси, в то время как Serializable
дает Вам семантику значения (т.е. состояние объекта копируется).
, Другими словами MarshalByRefValue
позволит Вам изменить экземпляр через другой AppDomains, в то время как Serializable
не будет. Последний полезен, когда просто необходимо получить информацию от одного AppDomain до другого, например, получить контент исключения от одного AppDomain до другого.