C# 我可以从Winforms应用程序同时将文件和模型上载到MVC 4操作吗?

C# 我可以从Winforms应用程序同时将文件和模型上载到MVC 4操作吗?,c#,asp.net-mvc,winforms,asp.net-mvc-4,file-upload,C#,Asp.net Mvc,Winforms,Asp.net Mvc 4,File Upload,我需要将签名板集成到内部网(MVC4)应用程序中,允许人们对系统生成的文档应用电子签名。不幸的是,我收到的签名板只有一个COM/ActiveX API,因此我编写了一个简短的Windows窗体应用程序,允许用户捕获签名并将其上载到服务器。上载时,我需要MVC4操作将签名图像与Windows窗体请求发送的指定文档实体相关联。假设我有这个模型: public class DocumentToSign { public int DocumentId { get; set; } pub

我需要将签名板集成到内部网(MVC4)应用程序中,允许人们对系统生成的文档应用电子签名。不幸的是,我收到的签名板只有一个COM/ActiveX API,因此我编写了一个简短的Windows窗体应用程序,允许用户捕获签名并将其上载到服务器。上载时,我需要MVC4操作将签名图像与Windows窗体请求发送的指定文档实体相关联。假设我有这个模型:

public class DocumentToSign { 
    public int DocumentId { get; set; }
    public int DocumentTypeId { get; set; } 
}
然后我执行以下操作以接收上载的图像:

[HttpPost]
public ActionResult UploadSignature(DocumentToSign doc, HttpPostedFileBase signature)
{
    //do stuff and catch errors to report back to winforms app
    return Json(new {Success = true, Error = string.Empty});
}
然后,上传图像的代码:

var doc = new DocumentToSign{ DocumentId = _theId, DocumentTypeId = _theType };
var fileName = SaveTheSignature();
var url = GetTheUrl();
using(var request = new WebClient())
{
    request.Headers.Add("enctype", "multipart/form-data");
    foreach(var prop in doc.GetType().GetProperties())
    {
        request.QueryString.Add(prop.Name, Convert.ToString(prop.GetValue(doc, null)));
    }
    var responseBytes = request.UploadFile(url, fileName);
    //deserialize resulting Json, etc.
}
模型绑定器似乎可以毫无问题地选择
DocumentToSign
类,但是
HttpPostedFileBase
始终为空。我知道我需要告诉model binder,上传的图像是动作中的
签名
参数,但我不知道怎么做。我尝试将
UploadValues
NameValueCollection
一起使用,但是
NameValueCollection
只允许值为
字符串,因此图像(即使是
字节[]
)也不能成为其中的一部分


是否可以从实际的MVC4应用程序外部将文件和模型上载到同一操作?我是否应该使用HttpPostedFileBase以外的东西?除了
网络客户端
?我不知所措。

var responseBytes=request.UploadFile(url,文件名)未以控制器期望的格式发送文件。
HttpPostedFileBase
用于
多部分/表单数据
POST请求。但是WebClient.UploadFile并没有发送多部分请求,它将文件内容作为请求体发送,而不包含其他信息。 您可以通过调用
Request.SaveAs(filename,false)保存文件

或者您必须更改发送文件的方式。但我认为WebClient不支持发送多部分请求。

签名
参数将绑定到同名请求中的一个值,例如输入名为
name=“signature”
或查询字符串参数名为
signature
,文件名为
byte[]
,您必须将其添加到发布的数据中。您将无法使用
上传文件
,您只需在表单中使用文件向该URL发布
即可。完全有可能在同一操作方法中填充模型和其他字段。@渐近错误-是的,我使用表单和
多次执行此操作,但是从来没有从应用程序之外获得过。好的,这是有道理的。所以我不能使用request.UploadFile。如果
WebClient
无法处理它,您知道会发生什么吗?
System.Net.Http.HttpClient
可以。下面是一个示例,看起来我必须更改控制器操作的签名才能执行异步操作,对吗?我使用
HttpClient
发布了它,但是控制器仍然没有得到任何东西。那么您可能需要调试这个问题。在控制器内设置断点,检查Request.Files是否包含任何文件,并且键值是否与控制器的参数名称相同。最后,我忘记了我的MVC4应用程序的目标是4.0而不是4.5,因此我无法选择
HttpClient
路径。我最终使用了边界,比如:。不过谢谢你。我认为这是4.5应用程序的答案。