2010-10-05 12 views
10

Próbuję przesłać obrazy do ImageShack za pomocą interfejsu API. Myślę, że wymagają one formularza o numerze multipart/form-data. Próbowałem zrobić to poniżej ...Jak zmienić nagłówek w WebClient

var wc = new WebClient(); 
wc.Headers.Add("Content-Type", "multipart/form-data"); 
... 
var fs = new FileStream(@"filepath", FileMode.Open, FileAccess.Read); 
byte[] bytes = new byte[fs.Length]; 
fs.Read(bytes, 0, Convert.ToInt32(fs.Length)); 
string encoded = Convert.ToBase64String(bytes); 
data.Add("fileupload", encoded); 
... 
byte[] output = wc.UploadValues("http://www.imageshack.us/upload_api.php ", "POST", data); 

ale dostał

System.Net.WebException was unhandled 
    Message=The Content-Type header cannot be changed from its default value for this request. 
    Source=System 
    StackTrace: 
     at System.Net.WebClient.UploadValues(Uri address, String method, NameValueCollection data) 
     at System.Net.WebClient.UploadValues(String address, String method, NameValueCollection data) 
     at WpfApplication1.ViewModels.ShellViewModel.Upload() in D:\tmp\WpfApplication1\WpfApplication1\ViewModels\ShellViewModel.cs:line 61 
     at WpfApplication1.ViewModels.ShellViewModel.<.ctor>b__1() in D:\tmp\WpfApplication1\WpfApplication1\ViewModels\ShellViewModel.cs:line 18 
     at MvvmFoundation.Wpf.RelayCommand.Execute(Object parameter) 
     at MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated) 
     at System.Windows.Controls.Primitives.ButtonBase.OnClick() 
     at System.Windows.Controls.Button.OnClick() 
     at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e) 
     at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e) 
     at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 
     at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
     at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
     at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
     at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent) 
     at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e) 
     at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 
     at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
     at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
     at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
     at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 
     at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args) 
     at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted) 
     at System.Windows.Input.InputManager.ProcessStagingArea() 
     at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input) 
     at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) 
     at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel) 
     at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
     at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
     at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
     at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
     at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
     at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
     at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
     at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
     at System.Windows.Threading.Dispatcher.Run() 
     at System.Windows.Application.RunDispatcher(Object ignore) 
     at System.Windows.Application.RunInternal(Window window) 
     at System.Windows.Application.Run(Window window) 
     at System.Windows.Application.Run() 
     at WpfApplication1.App.Main() in D:\tmp\WpfApplication1\WpfApplication1\obj\x86\Debug\App.g.cs:line 0 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

Co złego lub w jaki sposób można następnie zmienić nagłówki w WebClient?

+0

To więcej niż nagłówków. Oznacza to pakowanie treści w bardzo specyficzny sposób, którego funkcja UploadValues ​​nie jest w stanie przetworzyć. Konieczne może być przekształcenie go i ręczne wysłanie "bajtu" [body] ciała. Co jest trudne. Lub uzyskaj komponent, który zrobi to za Ciebie. Lub zapytaj, czy możesz po prostu wysłać treść pliku jako ładunek. –

Odpowiedz

17

Wygląda na to, że nie można ustawić typu zawartości za pomocą metody WebClient.UploadValues. Można ustawić Content-type metodą WebClient.UploadData

użyć czegoś podobnego,

Client.Headers["Content-Type"] = "application/json"; 
Client.UploadData("http://www.imageshack.us/upload_api.php", "POST", Encoding.Default.GetBytes("{\"Data\": \"Test\"}")); 
+0

Dziękuję bardzo za to - użyłem UploadString bez kości. Nie mogę uwierzyć w dokumenty; Gdybym chciał spędzić czas na próbach i błędach lub konsultacjach z innymi, byłbym programistą unix! –

+0

@GerardONeill - Udało mi się wywołać 'Client.Headers.Add (HttpRequestHeader.ContentType," appliction/json ") używając' UploadString (string, string) 'i wysyłając dane jako drugi parametr - myślę, że problem jest z 'UploadValues' jak w pytaniu. –

+3

3 lata później i nadal była to szalona pomocna odpowiedź, +1 synu. – Smoore

0

z documentation, WebException jest generowany, gdy:

Nagłówek Content-Type nie jest zerowy odniesienia (Nothing w języku Visual Basic) lub "application/x-www-form-urlencoded".

+0

Widziałem to, ale używam "wieloczęściowy/formularz danych"? ... och nie jest icic, ale jak mogę zmienić typ zawartości? –

+0

Wygląda na to, że nie możesz. Z dokumentacji wynika, że ​​"application/x-www-form-urlencoded" jest jedyną dopuszczalną wartością. –

Powiązane problemy