के लिए MediaTypeFormatter
रजिस्टर करने की आवश्यकता मैं अंत में reflection का भारी इस्तेमाल करके WebAPI इकाई परीक्षण के लिए HttpContext
को नकली फ़ाइलें जोड़ने के लिए कर रहा था, यह देखते हुए Request.Files
के सबसे कि बुनियादी ढांचे को सीलबंद या आंतरिक वर्गों में छुपाया जाता है।
एक बार जब आप नीचे दिए गए कोड जोड़ दिया है, फ़ाइलों HttpContext.Current
को अपेक्षाकृत आसानी से जोड़ा जा सकता है:
var request = new HttpRequest(null, "http://tempuri.org", null);
AddFileToRequest(request, "File", "img/jpg", new byte[] {1,2,3,4,5});
HttpContext.Current = new HttpContext(
request,
new HttpResponse(new StringWriter());
बड़े कार्य करने के साथ
द्वारा किया:
static void AddFileToRequest(
HttpRequest request, string fileName, string contentType, byte[] bytes)
{
var fileSize = bytes.Length;
// Because these are internal classes, we can't even reference their types here
var uploadedContent = ReflectionHelpers.Construct(typeof (HttpPostedFile).Assembly,
"System.Web.HttpRawUploadedContent", fileSize, fileSize);
uploadedContent.InvokeMethod("AddBytes", bytes, 0, fileSize);
uploadedContent.InvokeMethod("DoneAddingBytes");
var inputStream = Construct(typeof (HttpPostedFile).Assembly,
"System.Web.HttpInputStream", uploadedContent, 0, fileSize);
var postedFile = Construct<HttpPostedFile>(fileName,
contentType, inputStream);
// Accessing request.Files creates an empty collection
request.Files.InvokeMethod("AddFile", fileName, postedFile);
}
public static object Construct(Assembly assembly, string typeFqn, params object[] args)
{
var theType = assembly.GetType(typeFqn);
return theType
.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null,
args.Select(a => a.GetType()).ToArray(), null)
.Invoke(args);
}
public static T Construct<T>(params object[] args) where T : class
{
return Activator.CreateInstance(
typeof(T),
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance,
null, args, null) as T;
}
public static object InvokeMethod(this object o, string methodName,
params object[] args)
{
var mi = o.GetType().GetMethod(methodName,
BindingFlags.NonPublic | BindingFlags.Instance);
if (mi == null) throw new ArgumentOutOfRangeException("methodName",
string.Format("Method {0} not found", methodName));
return mi.Invoke(o, args);
}
मैं बदल कर एक ही कोड की कोशिश की फ़ाइल भौतिक पथ के लिए HttpRequest का पहला पैरामीटर, लेकिन नियंत्रक में फ़ाइल नहीं मिल सका। क्या आप समझा सकते हैं कि ऐसा कैसे करें? – Srini