Этот веб-клиент на самом деле не работает в контексте клиента (веб-API), который его вызывает, и реферер не будет заполнен.
Я не могу проверить это прямо сейчас, но в основном UrlReferer
- это не что иное, как заголовок HTTP Referer
. Таким образом, теоретически вы можете добавить этот заголовок к WebClient
самостоятельно ...
client.Headers.Add("Referer","whatever_you_want_to_add");
Вы будете добавлять его вручную, что не идеально, но это лучшее, что вы можете сделать. Помните, что заголовок Referer
не установлен, если:
Вам не нужно беспокоиться о получении аргументов и вызове MethodInfo самостоятельно, вы можете позволить .NET сделать это за вас. Все, что вам нужно сделать, это создать лямбда-выражение, содержащее этот метод.
Например,
MethodCallExpression expression = GetExpressionSomeHow();
object result = Expression.Lambda(expression).Compile().DynamicInvoke();
Вот как я в любом случае имею дело с вложенными запросами в моем провайдере Linq. LambdaExpression в переменной выбора. В этом случае вы должны иметь возможность просто скомпилировать и вызвать его напрямую:
object result = selector.Compile().DynamicInvoke();
Compiling an expression is a very intensive operation, so I would only do that if you are planning on re-using the expression. I would recommend the reflection way otherwise; you will find it executes faster. Never call expression.Compile() in a tight loop.
@ Ch00k <- Спасибо, хорошее объяснение. Я просто хотел бы добавить, что
selector.Compile();
дает вам делегата. Для метода экземпляра вам нужен экземпляр, на котором можно вызвать этот метод. Вы передаете этот экземпляр в качестве аргумента DynamicInvoke ala
// Grab the method from MyClass - param1 and param2 are the actual parameters you
// want to pass to the method call.
Expression<Func<MyClass, TValue>> selector = (x => x.MyMethod(param1, param2));
// Create an instance of MyClass to call the method on
var myClass = new MyClass();
// Call the method on myClass through DynamicInvoke
object returnValue = selector.Compile().DynamicInvoke(myClass);